【发布时间】:2018-01-31 18:34:40
【问题描述】:
我几乎解决了我的问题,但错过了最后一块......
我有一个对象列表,我希望能够添加值类型(通常会被序列化为字符串)并将它们恢复为原始类型。 例如:Guids 或自定义值类型。
这是一个示例自定义值类型:
public struct ExtString
{
private String Value
{
get;
set;
}
public static implicit operator ExtString(String str)
{
return !String.IsNullOrWhiteSpace(str) ? new ExtString(str) : null;
}
public static implicit operator String(ExtString exStr)
{
return exStr.ToString();
}
public ExtString(String str)
{
this.Value = str;
}
public override String ToString()
{
return this.Value;
}
}
这是自定义转换器:
public class CustomConverter : JsonConverter
{
public override Boolean CanConvert(Type objectType)
{
return objectType.IsValueType;
}
public override bool CanRead => false;
public override void WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("$type");
writer.WriteValue(value.GetType().AssemblyQualifiedName);
writer.WritePropertyName("$value");
writer.WriteValue(value.ToString());
writer.WriteEndObject();
}
这是序列化/反序列化的示例代码:
var jsonSerializerSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All,
Converters = new JsonConverter[]
{
new CustomConverter()
}
};
var list = new List<Object>();
list.Add(Guid.NewGuid());
list.Add((ExtString)"Hello World");
var ser = JsonConvert.SerializeObject(list, Formatting.Indented, jsonSerializerSettings);
var deser = JsonConvert.DeserializeObject(ser, jsonSerializerSettings);
这几乎一直有效... Guid 和 ExtString 都被正确序列化,并且 Guid 甚至被反序列化为正确的值(没有特殊处理!),并且 ExtString 被正确创建(在反序列化时)但具有值null(构造函数被调用,但 str 为 null)。
我错过了什么?为什么它适用于 Guid?
谢谢。
【问题讨论】:
-
什么是JsonConverter?它来自什么命名空间、库等?
-
对不起。 Json.Net (Newtonsoft)
标签: c# .net json serialization json.net