【问题标题】:ProtoBuf.NET not serializing when using DataContract attributes使用 DataContract 属性时 ProtoBuf.NET 未序列化
【发布时间】:2012-09-10 14:46:50
【问题描述】:

我在 NuGet (2.0.0.480) 上使用最新版本的 ProtoBuf,它不会序列化标有 DataContract/DataMember 属性的类型:

[DataContract]
public class Person
{
    [DataMember]
    public string Firstname { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var outputFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "person.dat");

        var person = new Person { Firstname = "ben" };

        using (var fs = new FileStream(outputFile, FileMode.OpenOrCreate)) {
            Serializer.Serialize(fs, person);
        }

        using (var fs = File.OpenRead(outputFile))
        {
            var result = Serializer.Deserialize<Person>(fs);
            Console.WriteLine(result.Firstname);
        }

        Console.ReadLine();
    }
}

但是,如果我使用 ProtoBuf 特定属性来装饰我的类:

[ProtoContract]
public class Person
{
    [ProtoMember(1)]
    public string Firstname { get; set; }
}

它按预期工作。

【问题讨论】:

    标签: protobuf-net


    【解决方案1】:

    它需要Order 属性来获得唯一且可靠的密钥号:

    [DataContract]
    public class Person
    {
        [DataMember(Order=1)]
        public string Firstname { get; set; }
    }
    

    【讨论】:

      【解决方案2】:

      在使用[DataMember] 时,我应该更仔细地阅读文档必须指定订单

      例如

      [DataMember(Order = 1)]

      【讨论】:

        【解决方案3】:

        除了 Marc 和 Ben 的回答之外,请注意您必须将 order 值设置为大于 0。
        我们曾经在使用 BCL 序列化程序时从 0 开始顺序,但 protobuf-net 忽略了顺序为 0 的数据成员。

        【讨论】:

          猜你喜欢
          • 2011-11-21
          • 2011-06-19
          • 1970-01-01
          • 2012-07-03
          • 1970-01-01
          • 1970-01-01
          • 2012-04-09
          • 2013-11-26
          • 1970-01-01
          相关资源
          最近更新 更多