如何在Android中反序列化ProtoBuf-net

时间:2019-02-06 05:50:09

标签: java android protobuf-net

我有一个使用ProtoBuf-net进行序列化的WebApi。很好。

现在,我需要在我的Android应用中使用WebApi。我的问题是,如何在Android中使用反序列化?还是不可能,我必须在WebApi中使用Google.ProtoBuf吗?

我真的很喜欢ProtoBuf-net,因此,如果可以的话,我希望继续使用ProtoBuf-net。我只需要找到在Android中反序列化它的方法。请为我指出正确的方向。

谢谢...

更新:

这是从提琴手那里得到的回应

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/x-protobuf
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcWENJRllcRG90TkVUXFVCcm9kXFVXZWJBUElcVVdlYkFQSVxhcGlcZGV2aWNlXEdldEdyb3Vwcw==?=
X-Powered-By: ASP.NET
Date: Wed, 06 Feb 2019 07:36:52 GMT
Content-Length: 76


"   XzFood          !        
&   XzClothing          !        

这是我的模特

private int id = 0;
[ProtoMember(11)]
public int Id
{
    get { return id; }
    set { id = value; }
}

private string name = string.Empty;
[ProtoMember(15)]
public string Name
{
    get { return name; }
    set { name = value; }
}

private List<CDProduct> products = new List<CDProduct>();
[ProtoMember(45)]
public List<CDProduct> Products
{
    get { return products; }
    set { products = value; }
}

1 个答案:

答案 0 :(得分:1)

您提到Android,而您提到Java。如果您在Android上使用Java进行编码,则实际上您将无法使用protobuf-net,因为它是.NET特定的-但是protobuf-net会尝试使您轻松进行过渡。在现有代码中,您可以使用:

var proto = Serializer.GetProto<YourRootType>();

这将为您提供一个表示.proto模型的YourRootType模式(“ proto2”和“ proto3”等选项)。它通常正常运行,但是如果您使用DateTime选项拥有DataFormat.WellKnown 这样的功能,则可能会有些尴尬(提示:如果可能,请为所有DataFormat.WellKnown / DateTime属性切换到TimeStamp选项,但请注意,这样做是一项重大更改;这将使用google.protobuf.Timestamp和Google在“ proto3”时间范围内添加了google.protobuf.Duration版式。

然后通过protoc运行该.proto模式,并且应该获取用于同一模型的可用Java代码。

注意:如果要进行调整,请随时更改生成的.proto模式中的名称;名称无关紧要-字段编号和类型:可以。