我有一个类如下的基类:
[Serializable]
public class SerializableDomainObject<T>
{
public SerializableDomainObject()
{
ID = Guid.NewGuid();
}
[DataMember(Name="ID", Order = 0)]
public Guid ID { get; private set; }
public void Save()
{
// serialize
}
public void Load()
{
// deserialize
}
}
然后我有很多派生类,这里有一个例子:
[DataContract(Name="MyDomainObject")]
public class MyDomainObject : SerializableDomainObject<MyDomainObject>
{
public MyDomainObject()
{
}
public MyDomainObject(string name)
{
Name = name;
}
[DataMember(Order = 1)]
public string Name { get; private set; }
}
这里序列化的是输出:
<MyDomainObject xmlns="http://schemas.datacontract.org/2004/07/DomainObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<_x003C_ID_x003E_k__BackingField>2b3c00f6-1b15-4a6b-bd6c-a1f447ea5a34</_x003C_ID_x003E_k__BackingField>
<Name>AName</Name>
</MyDomainObject>
为什么ID属性没有使用我在基类的DataMember属性中提供的名称进行序列化?
答案 0 :(得分:3)
这是因为您已将属性的setter声明为private
- 因为它是私有的,DataContractSerializer正在序列化支持字段并使用其名称而不是属性。
DataContractSerializer会愉快地序列化您要求的任何成员,但是会对语言的语义进行序列化。通常最好简单地声明您的数据合同,而不需要像这样的大量可见性控制,因为服务和客户端之间的消息合同应该简单易用。创建开放和不受限制的数据合同,但锁定您的运营合同。
答案 1 :(得分:-1)
您可以尝试将私人声明更改为内部声明吗?这还能满足您的可视性需求吗?我对我的合同和事情进行了很好的序列化/反序列化。