将protobuf-net序列化对象转换为Java

时间:2014-02-01 17:00:48

标签: protobuf-net couchbase

我将这些.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

1 个答案:

答案 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