1

我有一个如下基类:

[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 属性中提供的名称进行序列化?

4

2 回答 2

3

这是因为您已将属性的 setter 声明为private- 因为它是私有的,所以 DataContractSerializer 正在序列化支持字段并使用其名称而不是属性。

DataContractSerializer 将愉快地序列化您要求的任何成员,但要考虑语言的语义。通常最好简单地声明您的数据合约,而不需要像这样的大量可见性控制,因为服务和客户端之间的消息合约应该简单明了且易于使用。创建开放且不受限制的数据合约,但锁定您的运营合约。

于 2010-02-02T14:40:27.023 回答
-1

您可以尝试将您的私人声明更改为内部声明吗?这仍然可以满足您的可见性需求吗?我的合同上有这个,而且事情序列化/反序列化非常好。

于 2010-02-02T14:55:26.843 回答