数据被c# protobuf-net序列化并设置为redis,现在我想获取数据并在java程序中反序列化它,除了datetime字段之外一切正常,它们不能被正确序列化。在c#程序中,数据从实体序列化,如下所示,并设置为redis
[Serializable]
[ProtoContract]
public class TestMsg
{
public TestMsg();
[ProtoMember(1)]
public string message { get; set; }
[ProtoMember(2)]
public DateTime UpdateTime { get; set; }
}在我的java程序中,原型文件如下所示:
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代码
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?
}发布于 2017-11-02 16:27:02
最近,出现了描述时间的新的“众所周知的”合同。最好的办法是在java .proto中使用"timestamp“,并通过[ProtoMember]用WellKnown数据格式注释DateTime成员。
为了更简单地了解这一点:编写一个使用“.proto”的时间戳(不管怎样,你都需要为java做这件事),并通过https://protogen.marcgravell.com运行它,看看输出是什么。这是你的.proto的一个修改过的版本,你只需要点击“生成”:https://protogen.marcgravell.com/#g38c45fbb1730d14bc4d560a13f61d2a3 -正如你所看到的,关键部分是:
[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手动解码它;我很抱歉它并不像它可能的那样简单,但是:它必须是某种东西,并且当时没有任何“众所周知”的东西存在。
https://stackoverflow.com/questions/47066904
复制相似问题