WCF反序列化有一些神奇之处.如何在不调用其构造函数的情况下实例化数据协定类型的实例?
例如,考虑这个数据合同:
[DataContract]
public sealed class CreateMe
{
[DataMember] private readonly string _name;
[DataMember] private readonly int _age;
private readonly bool _wasConstructorCalled;
public CreateMe()
{
_wasConstructorCalled = true;
}
// ... other members here
}
Run Code Online (Sandbox Code Playgroud)
通过DataContractSerializer您获取此对象的实例时,您将看到该字段_wasConstructorCalled是false.
那么,WCF如何做到这一点?这是其他人可以使用的技术,还是隐藏在我们之外?
我的应用程序使用XmlSerializer保存一个类,然后在需要时通过再次反序列化来创建一个实例.我想在我的构造函数逻辑中使用我的类的一些属性成员(在反序列化期间分配).可以假设首先分配属性,并且一旦分配了所有属性,就会调用构造函数吗?
继续讨论这个主题,是否有关于反序列化过程中发生的事件序列的文档?
我需要在反序列化后初始化私有只读字段.我有以下DataContract:
[DataContract]
public class Item
{
public Item()
{
// Constructor not called at Deserialization
// because of FormatterServices.GetUninitializedObject is used
// so field will not be initialized by constructor at Deserialization
_privateReadonlyField = new object();
}
// Initialization will not be called at Deserialization (same reason as for constructor)
private readonly object _privateReadonlyField = new object();
[DataMember]
public string SomeSerializableProperty { get; set; }
[OnDeserializing]
public void OnDeserializing(StreamingContext context)
{
// With this line code even not compiles, since …Run Code Online (Sandbox Code Playgroud) DataContractSerializer 反序列化时不调用构造函数或调用字段初始值设定项:
DataContractSerializer不调用我的构造函数?
使用DataContractSerializer时设置属性的初始值
是否可以readonly在对象反序列化后初始化字段?我必须放弃该语言功能才能使用DataContractSerializer吗?
我正在使用启用了延迟加载的Entity Framework 5.我有以下代码:
private ICollection<Subscription> _subscriptions = new Collection<Subscription>();
public virtual ICollection<Subscription> Subscriptions
{
get { return _subscriptions; }
set { _subscriptions = value; }
}
Run Code Online (Sandbox Code Playgroud)
但这有意义吗?我想确保公共属性Subscriptions永远不为null.由于虚拟实体框架会覆盖getter和setter以提供延迟加载功能.
我是否需要此字段,或者我可以只使用自动属性,如果没有订阅,我会得到一个空列表?