我在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; }
}
它按预期工作。
答案 0 :(得分:8)
需要Order
属性才能获得唯一且可靠的键号:
[DataContract]
public class Person
{
[DataMember(Order=1)]
public string Firstname { get; set; }
}
答案 1 :(得分:2)
我应该更仔细地阅读文档,使用[DataMember]
时必须指定订单。
e.g。
[DataMember(Order = 1)]
答案 2 :(得分:2)
除了Marc和Ben的答案外,请注意您必须将订单值设置为大于0 我们曾经在使用BCL序列化器时从0开始订单,但是protobuf-net忽略了订单为0的数据成员。