3

メッセージのシリアル化と逆シリアル化に protobuf-net を使用しています。私のメッセージには、null になる可能性のある来る文字列も含まれています。ただし、反対側でそれらを逆シリアル化すると、空の文字列 ("") が得られます。

Google ドキュメントによると、文字列型のデフォルト値は空の文字列です。この問題の解決策は何ですか?

私が使用しているコードは次のとおりです。

Command message = new Command();
message.s_value = null;
using (MemoryStream stream = new MemoryStream())
{
     Serializer.Serialize<Command>(stream, message);                
     stream.Close();
}

同じストリームを逆シリアル化すると、s_value = ""

4

1 に答える 1

5

あなたのタイプは、パラメーターなしのコンストラクターで明示的に文字列を "" に設定していると思います。チェックしていただけますか?

protobuf-net がこれを処理する方法は次のとおりです。

  • a のnull場合、も送信されません (protobuf ワイヤ形式には a を明示的に表現する方法はありませんがnull、オプションとして処理して省略できます)
  • の場合、""長さ 0 のパターンが送信されます。これは、次のように逆シリアル化する必要があります。""
  • 空でない文字列の場合、長さと文字列が送信され、逆シリアル化されます

逆シリアル化中に、null処理するデータがないため、フィールド/プロパティをそのままにしておく場合。タイプがデフォルトを に設定している場合、その""ままになります""

"v2" (今後 2 週間以内にこれをリリースする予定です) では、必要に応じて、"コンストラクターを実行しない" という WCF アプローチを使用するように指示できますnull デフォルトのコンストラクターがそれを割り当てます。

boolを意味するフラグを(別のプロパティとして)送信するために(「v1」を使用して)実行できるいくつかのトリックもありますnull。この例が必要な場合はお知らせください。


編集:これを回避するための「v1」トリックの例を次に示します。ただし、「コンストラクターを無視する」という「v2」アプローチは、おそらく長期的にはより良いオプションです。

[DataContract]
class Test {
    public Test() { Value = ""; } // a constructor that assigns the value

    [DataMember(Order = 1)]
    public string Value { get; set; } // our standard data
    [DataMember(Order = 2)]
    private bool ValueIsNull { // only exists to indicate explicit null
        get { return Value == null; }
        set { Value = value ? null : (Value ?? "");}
    }
}
于 2010-04-30T09:49:29.757 に答える