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

How to deserialize ProtoBuf-net in Android

我有一个使用 ProtoBuf-net 进行序列化的 WebApi。它工作正常。

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

我非常喜欢 ProtoBuf-net,所以,如果可以的话,我愿意继续使用 ProtoBuf-net。我只需要在 Android 中找到反序列化它的方法。请给我指明正确的方向。

谢谢...

更新:

这是从 Fiddler 获取时的响应

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

你提到Android,你提到Java。如果您在 Android 上使用 Java 进行编码,那么实际上您将无法使用 protobuf-net,因为它是 .NET 特定的 - 但 protobuf-net 试图让它变得容易你过渡。在您现有的代码中,您可以使用:

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

这将为您提供一个 .proto 模式,代表 YourRootType 的模型(有 "proto2" 与 "proto3" 等选项)。它 通常 工作正常,但如果你有类似 DateTime 的东西 使用 DataFormat.WellKnown 选项,那么它可能会有点尴尬(提示:如果可能,请为任何 DateTime/TimeStamp 属性切换到 DataFormat.WellKnown 选项,但请注意,这样做是一项重大更改;这将使用google.protobuf.Timestampgoogle.protobuf.Duration 布局由 Google 在 "proto3" 时间范围内添加。

然后您 运行 通过 protoc 那个 .proto 架构,您 应该 获得相同模型的可用 Java 代码。

注意:如果您想对其进行调整,请随意更改生成的 .proto 架构中的名称;名称无关紧要 - 字段编号和类型,但是:do.