的我有一个对象:序列化对象到阵列
[JsonConverter(typeof(MessageConverter))]
public class Message
{
[JsonProperty(Order = 1)]
public long Id { get; set; }
[JsonProperty(Order = 2)]
public string Msg { get; set; }
[JsonProperty(Order = 3)]
public int Timestamp { get; set; }
}
哪我想连载到以下形式的在JSON数组:
[long, string, int]
这个类将被嵌套在层次结构,所以自动转换将是首选。
我目前使用下面的代码,但这似乎包含大量的重复。
我想知道是否有一个属性/更紧凑的解决方案,可以让JSON.NET使用提供的属性提供相同的功能,而无需转换器。
public class MessageConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Message);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var arr = serializer.Deserialize<JToken>(reader) as JArray;
if (arr == null || arr.Count != 3)
throw new JsonSerializationException("Expected array of length 3");
return new Message
{
Id = (long)arr[0],
Msg = (string)arr[1],
Timestamp = (int)arr[2]
};
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var msg = value as Message;
var obj = new object[] { msg.Id, msg.Msg, msg.Timestamp };
serializer.Serialize(writer, obj);
}
}
谢谢,我正在寻找代码的紧凑性而不是输出的紧凑性。看起来可能存在一个通用的解决方案,所以我最终可能会编码我自己的。我会等一会儿再接受你的回答。 – user1112560 2014-09-19 01:05:13
是的,如果你不需要这个确切的输出,使用protobuf或bson库也会减少你的代码,因为一般的解决方案将在那个库中 – 2014-09-19 01:09:29