【发布时间】:2012-05-18 00:06:22
【问题描述】:
由于某些原因,我需要控制 .NET 中的对象序列化过程。我必须控制属性应该被序列化。这个过程应该是动态的,因此,在一个请求中,一组属性应该被序列化,而在另一个请求中——另一个。我很好奇是否可以通过已经存在的机制来实现或者我必须设计一些自定义序列化程序?
【问题讨论】:
标签: .net serialization
由于某些原因,我需要控制 .NET 中的对象序列化过程。我必须控制属性应该被序列化。这个过程应该是动态的,因此,在一个请求中,一组属性应该被序列化,而在另一个请求中——另一个。我很好奇是否可以通过已经存在的机制来实现或者我必须设计一些自定义序列化程序?
【问题讨论】:
标签: .net serialization
ISerializable 接口让您可以做到这一点。基本上,您可以控制在执行序列化时将哪些值添加到“属性包”(SerializationInfo)。请注意,您甚至不仅限于类型的属性,如下所示。
public class StackOverflow_10639264
{
[Serializable]
public class MyType : ISerializable
{
public string SerializedAM { get; set; }
public string SerializedPM { get; set; }
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
DateTime now = DateTime.Now;
if (now.Hour < 12)
{
info.AddValue("MyValue", this.SerializedAM);
}
else
{
info.AddValue("MyValue", this.SerializedPM);
info.AddValue("NotAProperty", "Hello");
}
}
}
public static void Test()
{
MemoryStream ms = new MemoryStream();
DataContractSerializer dcs = new DataContractSerializer(typeof(MyType));
dcs.WriteObject(ms, new MyType { SerializedAM = "AM", SerializedPM = "PM" });
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
}
}
【讨论】:
MyType)。如果要定义应该序列化的内容,可以将其存储在类型本身的某个字段/属性中。