【发布时间】:2013-05-27 19:50:31
【问题描述】:
我正在使用 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 肯定有更好、更少涉及的方法吗?
【问题讨论】: