首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在java程序中反序列化被protobuf-net序列化的数据

如何在java程序中反序列化被protobuf-net序列化的数据
EN

Stack Overflow用户
提问于 2017-11-02 11:01:49
回答 1查看 285关注 0票数 1

数据被c# protobuf-net序列化并设置为redis,现在我想获取数据并在java程序中反序列化它,除了datetime字段之外一切正常,它们不能被正确序列化。在c#程序中,数据从实体序列化,如下所示,并设置为redis

代码语言:javascript
复制
[Serializable]
[ProtoContract]
public class TestMsg 
{
    public TestMsg();
    [ProtoMember(1)]
    public string message { get; set; }
    [ProtoMember(2)]
    public DateTime UpdateTime { get; set; }
}

在我的java程序中,原型文件如下所示:

代码语言:javascript
复制
syntax = "proto2";
option java_outer_classname = "TestMsgEntity";
message TestMsg {
    required string Message = 1;//
    required string UpdateTime = 2;// it can not be deserialized properly.if I change is to long,then i get zero .
}

//java代码

代码语言:javascript
复制
byte[]  byteArrayRedis  = provider.getbyte("keyname"); //get the data from redis

ByteArrayInputStream baiContent = new ByteArrayInputStream(byteArrayRedis);
try {
        TestMsgEntity.TestMsg msg = TestMsgEntity.TestMsg.parseFrom(baiContent);
        String message = msg.getMessage (); //it is ok
        String lastUpdate =msg.getLastUpdateTime();//how can i get the value? 
    }
EN

回答 1

Stack Overflow用户

发布于 2017-11-02 16:27:02

最近,出现了描述时间的新的“众所周知的”合同。最好的办法是在java .proto中使用"timestamp“,并通过[ProtoMember]WellKnown数据格式注释DateTime成员。

为了更简单地了解这一点:编写一个使用“.proto”的时间戳(不管怎样,你都需要为java做这件事),并通过https://protogen.marcgravell.com运行它,看看输出是什么。这是你的.proto的一个修改过的版本,你只需要点击“生成”:https://protogen.marcgravell.com/#g38c45fbb1730d14bc4d560a13f61d2a3 -正如你所看到的,关键部分是:

代码语言:javascript
复制
[global::ProtoBuf.ProtoMember(2,
    DataFormat = global::ProtoBuf.DataFormat.WellKnown, IsRequired = true)]
public global::System.DateTime? UpdateTime { get; set; }

DataFormat = global::ProtoBuf.DataFormat.WellKnown告诉它使用timestamp表示法。类似地,这将导致TimeSpan使用众所周知的duration表示法。

如果你的protobuf-net存储的数据没有众所周知的格式,那么你将不得不通过bcl.proto手动解码它;我很抱歉它并不像它可能的那样简单,但是:它必须是某种东西,并且当时没有任何“众所周知”的东西存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47066904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档