2

Json.Net で System.Text.Encoding 型のプロパティを持つクラスをシリアル化/逆シリアル化しています。簡単なテストを試してみると、クラスは問題なくシリアル化されました。

public class TestClass {
    public Encoding TheEncoding { get; set; }
}

var testClass = new TestClass { TheEncoding = Encoding.UTF8 };
var json = JsonConvert.SerializeObject( testClass, Formatting.Indented );
var obj = JsonConvert.DeserializeObject<TestClass>( json );

シリアライズ先:

{
  "TheEncoding": {
    "BodyName": "utf-8",
    "EncodingName": "Unicode (UTF-8)",
    "HeaderName": "utf-8",
    "WebName": "utf-8",
    "WindowsCodePage": 1200,
    "IsBrowserDisplay": true,
    "IsBrowserSave": true,
    "IsMailNewsDisplay": true,
    "IsMailNewsSave": true,
    "IsSingleByte": false,
    "EncoderFallback": {
      "DefaultString": "?",
      "MaxCharCount": 1
    },
    "DecoderFallback": {
      "DefaultString": "?",
      "MaxCharCount": 1
    },
    "IsReadOnly": true,
    "CodePage": 65001
  }
}

ただし、逆シリアル化すると、例外が発生しました。

タイプ System.Text.Encoding のインスタンスを作成できませんでした。型はインターフェイスまたは抽象クラスであり、インスタンス化できません。パス「TheEncoding.BodyName」、行 3、位置 16。

System.Text.Encoding 型を処理するカスタム コンバーターを作成することで、この問題を回避できました。

public class JsonEncodingConverter : JsonConverter {
    public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer ) {
        // Serialize as the BodyName.
        serializer.Serialize( writer, ( value as Encoding ).BodyName );
    }

    public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer ) {
        // Already good to go.
        return existingValue;
    }

    public override bool CanConvert( Type objectType ) {
        return ( typeof ( Encoding ).IsAssignableFrom( objectType ) );
    }
}

var testClass = new TestClass { TheEncoding = Encoding.UTF8 };
var json = JsonConvert.SerializeObject( testClass, Formatting.Indented, new JsonEncodingConverter() );
var obj = JsonConvert.DeserializeObject<TestClass>( json , new JsonEncodingConverter() );

カスタム コンバーターを使用してシリアル化すると、次のものが生成されるようになりました。

{
  "TheEncoding": "utf-8"
}

そして、この JSON は、カスタム コンバーターで逆シリアル化されると、元のオブジェクトに正常に往復できます。

私は Json.Net を初めて使用しますが、これを難しい方法で行っていると強く感じています。確かに、System.Text.Encoding を処理するためのより良い、あまり関与しない方法はありますか?

4

2 に答える 2

0

この問題に取り組むより良い方法は、JSON オブジェクトに必要なプロパティを正確に把握することだと思います。

Encodingサーバー側では、.NET フレームワークの一部として実行時に既にアクセスできるため、オブジェクトのすべてのプロパティを含める理由はありません。

Encodingクライアントでは、オブジェクトのすべてのプロパティが必要になる理由がわかりません。

EncodingNameorを送信するだけでより直感的になりBodyName、サーバーで使用するエンコーディング オブジェクトを決定できます。

例として、JSON を指定してサーバーに送信するutf-8場合、 Encoding.UTF8.

于 2013-05-31T22:04:13.393 に答える