使用JSON.NET在C#中进行不正确的序列化

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引擎它显然处理错误的类型的正确方法吗?由于我正在使用一组有限的"原语"作为我的对象的核心,如果我可以为每种类型创建一组转换器,那会解决我的问题吗?

如果可能的话,我想避免重新发明轮子,因为这似乎是一个已经优雅处理的问题,并且我想利用这样的东西(如果可用的话).

Ran*_*pho 1

这似乎是 JSON.NET 中的一个实际错误。

这不是一个主意,但解决方法可能是进行两阶段序列化。第一个是实际序列化到 JSON 或从 JSON 序列化的对象,仅包含具有string类型的字段/属性。第二个对象(服务器端代码将使用的对象)将是手动转换为强类型的对象。

理想,但有可能。此外,您可以考虑使用DataContractJsonSerializer,它在处理字节数组和 guid IME 方面做得非常好。日期仍然很糟糕,但这主要是 Javascript 的错误。