《JSON序列化》一

JSON格式在描述一个JavaScript对象一般都能胜任的,包括字符串、数字、Bool、数组都能在格式中分辨清楚。

JSON序列化图解

1.Object对象

2.1数组对象


  微软自身就有不只一种JSON的序列化机制,例如WCF下的JSON序列化。还有诸如Json.net之类的第三方工具.

 另外,JSON序列化还要关心其可扩展性。毕竟复杂对象的序列化,尤其是带有相互引用关系的对象,很容易产生无限递归,导致堆栈溢出。微软的Asp.netAJAX就提供了一种定制序列化的手段,编写一个Converter

public class DemoEntityConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            DemoEntity entity = new DemoEntity();
            entity.P1 = DictionaryHelper.GetValue(dictionary, "P1", string.Empty);
            entity.P2 = DictionaryHelper.GetValue(dictionary, "P2", string.Empty);
            entity.P3 = DictionaryHelper.GetValue(dictionary, "P3", string.Empty);
 
            //解决对象之间循环引用的问题
            if (dictionary.ContainsKey("Entity2"))
            {
                entity.Entity2 = JSONSerializerExecute.Deserialize<DemoEntity2>(dictionary["Entity2"]);
                entity.Entity2.Entity = entity;
            }
 
            return entity;
        }
 
        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            IDictionary<string, object> dictionary = new Dictionary<string, object>();
 
            DemoEntity entity = (DemoEntity)obj;
 
            //仅序列化需要的属性,减少json串大小
            DictionaryHelper.AddNonDefaultValue<string, object>(dictionary, "P1", entity.P1);
            DictionaryHelper.AddNonDefaultValue<string, object>(dictionary, "P2", entity.P2);
            DictionaryHelper.AddNonDefaultValue<string, object>(dictionary, "P3", entity.P3);
            dictionary.Add("Entity2", entity.Entity2);
 
            return dictionary;
        }
 
        public override IEnumerable<Type> SupportedTypes
        {
            get
            {
                return new Type[] { typeof(DemoEntity) };
            }
        }
}
  上面的代码中,就为类型 DemoEntity ,定制了一个 JSON 序列化器。当然在使用之前,需要先为类型 DemoEntity ,注册此序列化器。

JSONSerializerExecute.RegisterConverter(typeof(DemoEntityConverter));

  在一个AppDomain中,仅仅注册一次就行。上面的总结,只是我们自己扩展了一个类,这个类可以解决我们在序列化过程中产生的对象之间循环引用问题,这个问题很容易产生无限递归,导致堆栈溢出。至于客户端怎么调用,我们来看下一篇博客。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值