如何在 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.Timestamp
和 google.protobuf.Duration
布局由 Google 在 "proto3" 时间范围内添加。
然后您 运行 通过 protoc
那个 .proto 架构,您 应该 获得相同模型的可用 Java 代码。
注意:如果您想对其进行调整,请随意更改生成的 .proto 架构中的名称;名称无关紧要 - 字段编号和类型,但是:do.
我有一个使用 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.Timestamp
和 google.protobuf.Duration
布局由 Google 在 "proto3" 时间范围内添加。
然后您 运行 通过 protoc
那个 .proto 架构,您 应该 获得相同模型的可用 Java 代码。
注意:如果您想对其进行调整,请随意更改生成的 .proto 架构中的名称;名称无关紧要 - 字段编号和类型,但是:do.