我将这些.NET序列化对象存储在couchbase中,我正在尝试使用Java程序读取这些对象。使用protobuf-net对对象进行了序列化,并且无法更改该代码。我已经附上了下面的代码片段,其中显示了被序列化的带注释的类。
[ProtoContract]
[VersionType(Version = VersionNumbers.V3)]
public class A : B
{
[ProtoMember(1)]
public UInt16 field1 { get; set; }
[ProtoMember(2)]
public UInt16 field2 { get; set; }
[ProtoMember(3)]
public UInt16 field3 { get; set; }
[ProtoMember(4, IsPacked = true)]
public List<UInt32> field4 { get; set; }
[ProtoMember(5, IsPacked = true)]
public byte[] field5 { get; set; }
[ProtoMember(6, IsPacked = true)]
public List<UInt16> field6 { get; set; }
}
我在这里关注了其他一些帖子,并试图创建一个看起来像这样的.proto文件 -
message A {
optional uint32 field1 = 1;
optional uint32 field2 = 2;
optional uint32 field3 = 3;
repeated uint64 field4 = 4 [packed=true];
optional bytes field5 = 5;
repeated uint32 field6 = 6 [packed=true];
}
但是,当我尝试对其进行反序列化时,我收到错误消息“协议消息包含无效标记(零)”。我认为我定义我的.proto文件的方式有问题,但我无法弄清楚问题是什么。我在这里犯了错误吗?
谢谢! 的Vivek
答案 0 :(得分:0)
你最好的选择是使用Serializer.GetProto<A>()
看看protobuf-net认为匹配的.proto是什么样的。如果我对B
一无所知,我会得到:
message A {
optional uint32 field1 = 1 [default = 0];
optional uint32 field2 = 2 [default = 0];
optional uint32 field3 = 3 [default = 0];
repeated uint32 field4 = 4 [packed=true];
optional bytes field5 = 5;
repeated uint32 field6 = 6 [packed=true];
}
主要区别似乎是uint64
vs uint32
。