2017-11-02 19 views
1

データはC#protobuf-netでシリアル化され、赤字に設定されます。 今、データを取得してJavaプログラムですべてを逆シリアル化したいいいえ、datetimeフィールドを期待している、彼らは正しくシリアル化することはできません。Javaプログラムでprotobuf-netでシリアル化されたデータを逆シリアル化する方法

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コード

:C#プログラムで データは以下のようにエンティティから連載され、私のJavaプログラムで

[Serializable] 
[ProtoContract] 
public class TestMsg 
{ 
    public TestMsg(); 
    [ProtoMember(1)] 
    public string message { get; set; } 
    [ProtoMember(2)] 
    public DateTime UpdateTime { get; set; } 
} 

をRedisのために設定されているが、プロトflieは以下の通りです

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? 
    } 
+0

[Protobuf C#メッセージの翻訳をJAVAに変換](https://stackoverflow.com/questions/12186349/protobuf-c-sharp-message-translation-to-java) – wp78de

+0

も参照してください:https:// stackoverflow .com/questions/24036291/how-protobuf-net-serialize-datetime&https://stackoverflow.com/questions/12186349/protobuf-c-sharp-message-translation-to-java – wp78de

答えて

0

この質問はどこにも移動しないように思われるので:

protobuf-netプロジェクトのbcl.protoで定義されているように、は複数のフィールドで偽装されています。

あなたが複数のプラットフォームをターゲット場合にはDateTimeを使用して推奨されません、代わりにあなたのDTOモデルでlongまたはInt64を使用して、いくつかのエポックにいくつかの時間精度を表す(例えばミリ秒1970/Unix time以降)。

+0

実際には、よく知られている「タイムスタンプ」サポートを使用します。これはDateTimeに対して有効にすることができます。 –

+0

ありがとうございました。私の答えはもう必要ない。 :) – wp78de

1

最近、時間を記述するための新しい「よく知られた」契約があります。あなたの最善の策は、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; } 

それはtimestamp表記を使用するように指示しますDataFormat = global::ProtoBuf.DataFormat.WellKnownです。同様に、これによりTimeSpanはよく知られているdurationという表記を使用します。あなたは、よく知られたフォーマットせずにいるProtobufネットで保存された既存のデータがある場合


、あなたはbcl.proto経由で手動でデコードする必要があります。私はそれができるほどシンプルではないことをお詫びしますが、それは何かである必要があり、その時点で「よく知られている」ものは存在しませんでした。

関連する問題