我在继承的部分类上有一个datacontract,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace Domain
{
[DataContract]
public partial class IdCard : DomainObject<System.Int64>
{
private Group _grp;
[DataMember]
public virtual Group Grp
{
get { return _grp; }
set { _grp = value; }
}
private bool _unproxized = true;
public override object UnProxy()
{
if (this._unproxized) // this prevents stackoverflow with cyclical references
{
this.Grp = (Group)this.Grp.UnProxy();
this._unproxized = false;
}
return this;
}
}
}
出于某种原因,_unproxized永远不会设置为true;有什么想法吗?
我知道我可以简单地切换逻辑,但我很好奇为什么成员变量没有被初始化。
答案 0 :(得分:4)
您正在查看的实例是否已反序列化?在标准DataContract反序列化期间,不会调用构造函数,只会分配DataMembers。您正在查看的变量未标记为DataMember。
此thread使用几乎相同的示例描述了您所看到的行为的实现。
答案 1 :(得分:2)
这是因为在反序列化时,DataContract serialiser
使用一种反射来创建完全未初始化的对象实例,然后应用数据。这就是DataContract serialiser
不需要无参数构造函数的原因。 (即使你添加一个,它也不会被调用)。如果您使用_unproxied
属性标记[DataMember]
字段,则为真。
答案 2 :(得分:0)
我怀疑您使用的是网络/服务参考。在这种情况下,代码(私有变量)永远不会到达客户端。
答案 3 :(得分:0)
尝试在构造函数中分配变量,如下所示:
public IdCard()
{
_unproxized = true;
}