加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:32:35 所属栏目:百科 来源:网络整理
导读:我试图采取像这样结构的对象 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 Paylo
我试图采取像这样结构的对象
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;}
}

并使用以下调用使用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);

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}

但是,当我进行反序列化调用时,生成的项目部分不正确

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

SourceTypeID成员(Guid)和Payload成员(对象,持有byte [])都是不正确的.序列化字符串似乎保持guid的正确标识,但不适用于字节数组.

我看到SerializeObject的替代签名是

SerializeObject(object value,params JsonConverter[] converters);

这是通知de / serialization引擎它显然处理错误的类型的正确方法吗?由于我正在使用一组有限的“原语”作为我的对象的核心,如果我可以为每种类型创建一组转换器,那会解决我的问题吗?

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

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

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

不理想,但可能.另外,您可以考虑使用DataContractJsonSerializer,它可以很好地处理字节数组和指导IME.日期仍然非常糟糕,但这主要是Javascript的错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读