1

我刚刚更新到 r275 版本,它似乎不再正确管理 DataContract 类通过序列化这个非常简单的类:

[DataContract]
public class ProtoData
{
    [DataMember(Order = 1)]
    private long _id;
    [DataMember(Order = 2)]
    private string _firstName;
    [DataMember(Order = 3)]
    private string _lastName;

    public long Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }

    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }
    }

    public ProtoData(long id, string firstName, string lastName)
    {
        _id = id;
        _firstName = firstName;
        _lastName = lastName;
    }

    public ProtoData()
    {
    }

我得到只有数据合同类(以及此类列表/数组)可以被处理(错误处理 ProtoData)

4

2 回答 2

4

真的吗?那是……奇怪;我原以为单元测试会发生这样的重大变化。你确定你使用的是正确的版本吗?有一个 2.0 版本(包括[DataContract]支持,因为这是在 WCF 中,一个 3.0 扩展)和一个单独的 3.0 版本。您想要 3.0 版本 ( NET30.zip)。

使用 r275/NET30 测试成功:

static void Main() {
    ProtoData pd = new ProtoData {
        FirstName = "Marc",
        LastName = "Gravell",
        Id = 23354
    }, clone;
    using (MemoryStream ms = new MemoryStream()) {
        Serializer.Serialize(ms, pd);
        Console.WriteLine(ms.Length);
        ms.Position = 0;
        clone = Serializer.Deserialize<ProtoData>(ms);            
    }
    Console.WriteLine(clone.FirstName);
    Console.WriteLine(clone.LastName);
    Console.WriteLine(clone.Id);
}

带输出:

19
Marc
Gravell
23354
于 2009-11-22T09:44:54.470 回答
0

尝试以下操作:

  • 删除所有私人成员
  • 使用公共属性

    公共字符串姓氏;

  • 用 [DataMember] 标记所有公共属性

于 2009-11-21T11:25:36.863 回答