【发布时间】:2013-12-17 11:58:33
【问题描述】:
我想将 OpenTK 库的向量与 JSON 相互转换。我认为它的工作方式只是制作一个自定义 JsonConverter,所以我这样做了:
class VectorConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Vector4);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var obj = JToken.Load(reader);
if (obj.Type == JTokenType.Array)
{
var arr = (JArray)obj;
if (arr.Count == 4 && arr.All(token => token.Type == JTokenType.Float))
{
return new Vector4(arr[0].Value<float>(), arr[1].Value<float>(), arr[2].Value<float>(), arr[3].Value<float>());
}
}
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var vector = (Vector4)value;
writer.WriteStartArray();
writer.WriteValue(vector.X);
writer.WriteValue(vector.Y);
writer.WriteValue(vector.Z);
writer.WriteValue(vector.W);
writer.WriteEndArray();
}
}
现在,Write 部分对我来说非常简单(我认为?)。当序列化程序遍历对象时,如果遇到 CanConvert 方法以 true 响应的对象,它会让我的自定义序列化程序将其转换为 JSON。这行得通。
我没有真正得到的是另一种方式。由于没有办法知道当它只是用 JSON 中的文字编写时它是什么类型,所以我认为我必须自己分析该对象并确定它是否实际上是 Vector 对象。 我编写的代码有效,但如果检查失败,我不知道该怎么办。我如何告诉反序列化器这不是我知道如何翻译的对象之一,它应该做它的默认操作?
我是否遗漏了整个事情的运作方式?
【问题讨论】: