十年后,因此不是针对 OP,而是针对其他搜索此问题的人...
根据您进行序列化的方式,您可以使用SerializationSurrogates。这允许您在调用它时选择如何处理序列化:如果您指定某个代理项,它将使用它来执行序列化。如果不指定,它将使用默认值。
如果我们要使用他们的答案中提供的示例 Mickey Perlstein 作为起点,它可能看起来像这样:
[DataContract]
class Person
{
public Person()
{
}
public Person(string firstName, string lastName):this()
{
this.FirstName = firstName;
this.LastName = LastName;
}
[DataMember]
public string FirstName {get;set;}
[DataMember]
public string LastName { get; set; }
}
class PersonSerializationSurrogate : ISerializationSurrogate
{
public string FirstName { get; set; }
public string LastName { get; set; }
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
{
var p = (Person)obj;
info.AddValue(nameof(FirstName), p.FirstName);
info.AddValue(nameof(LastName), p.LastName);
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
{
var p = (Person)obj;
p.FirstName = info.GetString(nameof(FirstName));
p.LastName = info.GetString(nameof(LastName));
return p;
}
}
当您需要控制序列化过程时,就像使用 ISerializable 一样,您可以使用这个代理来实现。主要是从链接的文章中复制:
// This sample uses the BinaryFormatter.
IFormatter formatter = new BinaryFormatter();
// Create a MemoryStream that the object will be serialized into and deserialized from.
using (Stream stream = new MemoryStream())
{
// Create a SurrogateSelector.
var ss = new SurrogateSelector();
// using the Surrogate object.
ss.AddSurrogate(typeof(Person),
new StreamingContext(StreamingContextStates.All),
new PersonSerializationSurrogate());
// Associate the SurrogateSelector with the BinaryFormatter.
formatter.SurrogateSelector = ss;
try
{
// Serialize into the memory stream.
formatter.Serialize(stream, new Person("Jeff", "Sandepku"));
}
catch (SerializationException e)
{
Console.WriteLine($"Serialization failed: {e.Message}");
throw;
}
// Rewind the MemoryStream.
stream.Position = 0;
try
{
// Deserialize from the memory stream.
var p = (Person) formatter.Deserialize(stream);
// Verify that it all worked.
Console.WriteLine($"Name is {p.FirstName} {p.LastName}");
}
catch (SerializationException e)
{
Console.WriteLine($"Deserialization failed: {e.Message}");
throw;
}
}