使用 DataContractSerializer 时设置属性的初始值
Posted
技术标签:
【中文标题】使用 DataContractSerializer 时设置属性的初始值【英文标题】:Setting the initial value of a property when using DataContractSerializer 【发布时间】:2011-02-13 03:15:47 【问题描述】:如果我使用DataContractSerializer
对类进行序列化和反序列化,如何控制未序列化的属性的初始值?
考虑下面的Person
类。它的数据协定设置为序列化FirstName
和LastName
属性,但不序列化IsNew
属性。我希望 IsNew
初始化为 TRUE,无论新 Person 是作为新实例实例化还是从文件中反序列化。
这很容易通过构造函数来完成,但据我所知DataContractSerializer
不会调用构造函数,因为它们可能需要参数。
[DataContract(Name="Person")]
public class Person
[DataMember(Name="FirstName")]
public string FirstName get; set;
[DataMember(Name = "LastName")]
public string LastName get; set;
public bool IsNew get; set;
public Person(string first, string last)
this.FirstName = first;
this.LastName = last;
this.IsNew = true;
【问题讨论】:
【参考方案1】:您可以使用序列化回调。将以下方法添加到您的 Person 类:
[OnDeserialized]
void OnDeserialized(StreamingContext context)
this.IsNew = true;
另一个选项是删除 [DataContract] 和 [DataMember] 属性。在这种情况下,DCSerializer 将在反序列化时调用您的构造函数。
【讨论】:
正如 Pavel 所说,它应该是 [OnDeserializing] 否则每次都会覆盖该值,而不仅仅是一次(当它丢失时)。【参考方案2】:实际上正确的做法是使用 OnDeserializing 属性(注意“ing”后缀)。在成员值被反序列化之前调用该属性标记的方法。
【讨论】:
谢谢。是的, OnDeserializing 是正确的方法。如果源具有该属性的值,它允许设置可以被覆盖的默认值。以上是关于使用 DataContractSerializer 时设置属性的初始值的主要内容,如果未能解决你的问题,请参考以下文章
使用 DataContractSerializer 时设置属性的初始值
使用 DataContractSerializer 和 XmlDictionaryWriter 序列化 JObject 后崩溃
在原语列表上使用 DataContractSerializer 的自定义元素名称
使用 DataContractSerializer 的接口中的显式类型