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 を処理するためのより良い、あまり関与しない方法はありますか?