8

我在 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; }
}

它按预期工作。

4

3 回答 3

12

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

[DataContract]
public class Person
{
    [DataMember(Order=1)]
    public string Firstname { get; set; }
}
于 2012-09-10T14:52:29.890 回答
2

[DataMember] 当使用Order must be specified时,我应该更仔细地阅读文档。

例如

[DataMember(Order = 1)]

于 2012-09-10T14:51:45.743 回答
2

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

于 2012-11-13T12:39:11.667 回答