use*_*689 6 c# serialization json.net
我试图采取像这样结构的对象
public class Item
{
public Guid SourceTypeID {get;set;}
public Guid BrokerID {get;set;}
public double Latitude {get;set;}
public double Longitude {get;set;}
public DateTime TimeStamp {get;set;}
public object Payload {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
并使用以下调用使用JSON.NET对其进行序列化:
Item expected = new Item()
{
SourceTypeID = Guid.NewGuid(),
BrokerID = Guid.NewGuid(),
Latitude = 33.657145,
Longitude = -117.766684,
TimeStamp = DateTime.Now,
Payload = new byte[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
};
string jsonString = JsonConvert.SerializeObject(expected);
Run Code Online (Sandbox Code Playgroud)
Item对象的有效负载成员可能会保存C#原语列表中的任何一个原语(加上Guid之类的其他几个),或者这些类型的数组(如示例中的字节数组)或"flat"由任何先前列出的"基元"(动态创建)组成的对象.
当我执行SerializeObject()调用时,生成的字符串包含:
{"Payload":"AAECAwQFBgcICQ==","SourceTypeID":"d8220a4b-75b1-4b7a-8112-b7bdae956a45",
"BrokerID":"951663c4-924e-4c86-a57a-7ed737501dbd",
"TimeStamp":"\/Date(1328202421559-0600)\/",
"Latitude":33.657145,"Longitude":-117.766684}
Run Code Online (Sandbox Code Playgroud)
但是,当我进行反序列化调用时,生成的项目部分不正确
Item actual = JsonConvert.DeserializeObject<Item>(jsonString);
actual.SourceTypeID : {00000000-0000-0000-0000-000000000000}
actual.BrokerID : {951663c4-924e-4c86-a57a-7ed737501dbd}
actual.Latitude : 33.657145;
actual.Longitude : -117.766684;
actual.TimeStamp : {2/2/2012 11:07:01 AM}
actual.Payload : null
Run Code Online (Sandbox Code Playgroud)
SourceTypeID成员(Guid)和Payload成员(对象,持有byte [])都是不正确的.序列化字符串似乎保持guid的正确标识,但不适用于字节数组.
我看到SerializeObject的替代签名是
SerializeObject(object value, params JsonConverter[] converters);
Run Code Online (Sandbox Code Playgroud)
这是通知de/serialization引擎它显然处理错误的类型的正确方法吗?由于我正在使用一组有限的"原语"作为我的对象的核心,如果我可以为每种类型创建一组转换器,那会解决我的问题吗?
如果可能的话,我想避免重新发明轮子,因为这似乎是一个已经优雅处理的问题,并且我想利用这样的东西(如果可用的话).
这似乎是 JSON.NET 中的一个实际错误。
这不是一个主意,但解决方法可能是进行两阶段序列化。第一个是实际序列化到 JSON 或从 JSON 序列化的对象,仅包含具有string类型的字段/属性。第二个对象(服务器端代码将使用的对象)将是手动转换为强类型的对象。
不理想,但有可能。此外,您可以考虑使用DataContractJsonSerializer,它在处理字节数组和 guid IME 方面做得非常好。日期仍然很糟糕,但这主要是 Javascript 的错误。