4

これはシリアライゼーション全般に​​関する質問ですが、特に、.NET コードでServiceStack の優れたシリアライザーを使用しています。

デシリアライザーはプロパティに null 参照を設定する必要がありますか? 現在、null 参照を無視し、そのようなフィールドをクラスのデフォルトに従って設定できるようにしているようです。たとえば、次のテストは失敗します。

[TestMethod]
public void Deserialize_WithNullCollection_CollectionIsNull() {
    var serializer = new ServiceStack.Text.TypeSerializer<Foo>();
    Foo item = new Foo() { Strings = null };
    Foo result = serializer.DeserializeFromString(serializer.SerializeToString(item));
    Assert.IsNull(result.Strings);
}
public class Foo {
    public Foo() {
        Strings = new List<string>();
    }
    public List<string> Strings { get; set; }
}

おそらくこのテストは成功するはずですが、成功しません。item.Foo は null 参照ではなく空のリストです。null 参照は、実際の参照と同じように、オブジェクトの状態の一部であるように思えます。私は正しいですか、それとも間違っていますか?

4

1 に答える 1

4

これは仕様によるものです。

デフォルトでは(帯域幅を節約するため)、ServiceStackのテキストシリアライザーはネットワークnull上で値を出力しません。生成されたJSONにがない場合null、プロパティは逆シリアル化されたときに設定されません。そのため、コンストラクターで指定されたデフォルト値が使用されます。

次の方法でnull値を有効にできます。

JsConfig.IncludeNullValues = true;

これは静的(共有)プロパティであるため、一度設定すると、プロセスでグローバルに適用されます。

JsonSerilaizerを使用すると、このテストに合格します。

    [Test]
    public void Deserialize_WithNullCollection_CollectionIsNull()
    {
        JsConfig.IncludeNullValues = true;
        var item = new Foo { Strings = null };
        var json = JsonSerializer.SerializeToString(item);
        var result = JsonSerializer.DeserializeFromString<Foo>(json);
        Assert.IsNull(result.Strings);
    }

    public class Foo
    {
        public Foo()
        {
            Strings = new List<string>();
        }
        public List<string> Strings { get; set; }
    }

文字列リテラルと区別できないため、値をサポートしないJSV-Format(つまりTypeSerializer )では機能しません。したがって、JSV TypeSerializerを使用する場合は、その型のデフォルトのプロパティ値(つまり、デフォルトのコンストラクターで指定されている値)を意味すると想定する必要があります。null"null"null

于 2012-08-02T18:08:21.633 に答える