欢迎来到天天文库
浏览记录
ID:38526470
大小:29.00 KB
页数:7页
时间:2019-06-14
《自定义序列化对象c#》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、自定义序列化对象很多时候,我们需要将对象序列化成字符串保存到内存、磁盘或者Page.ViewState中。基于种种原因,我们希望序列化结果尽可能小,尽可能简单,即便用其他的方法(比如正则表达式)也能解析出数据。BinaryFormatter的结果转换成字符串(或者Base64)长度太大,而XmlSerializer对数据类型支持有限,显然内置的序列化引擎不足以满足我们的需求,还是自己丰衣足食。下面的代码可能还不完善,仅供参考,内容比较简单,不做详述。//////序列化///publicstaticstringSerializeObject(obje
2、cto){ charsep1='
3、'; charsep2=','; charsep3='='; StringBuildersb=newStringBuilder(); FieldInfo[]fields=o.GetType().GetFields(BindingFlags.Instance
4、BindingFlags.Public
5、 BindingFlags.NonPublic); foreach(FieldInfofieldinfields) { objectvalue=field.GetValue(o); if(value!=null) {
6、 if(field.FieldType.GetInterface("IDictionary")!=null) { foreach(objectkeyin(valueasIDictionary).Keys) { sb.AppendFormat("{0}{3}{1}{2}",key,(valueasIDictionary)[key],sep2,sep3); } if(sb[sb.Length-1]==sep2)sb.Remove(sb.Length-1,1); } elseif(fi
7、eld.FieldType.GetInterface("IList")!=null) { foreach(objectvin(valueasIList)) { sb.AppendFormat("{0}{1}",v,sep2); } if(sb[sb.Length-1]==sep2)sb.Remove(sb.Length-1,1); } elseif(field.FieldType==typeof(Boolean)) { sb.Append((bool)valu
8、e?"T":""); } else { sb.Append(value); } } sb.Append(sep1); } if(sb[sb.Length-1]==sep1)sb.Remove(sb.Length-1,1); returnsb.ToString();}//////反序列化///publicstaticTDeserializeObject(strings) whereT:new(){ charsep1='
9、'; charsep2=','; charse
10、p3='='; To=newT(); FieldInfo[]fields=o.GetType().GetFields(BindingFlags.Instance
11、BindingFlags.Public
12、 BindingFlags.NonPublic); string[]values=s.Split(sep1); for(inti=0;i13、e.GetInterface("IDictionary")!=null) { string[]vs=values[i].Split(sep2); IDictionarydictionary=field.GetValue(o)asIDictionary; Typekey=field.FieldType.IsGenericType? field.FieldType.GetGenericArgumen
13、e.GetInterface("IDictionary")!=null) { string[]vs=values[i].Split(sep2); IDictionarydictionary=field.GetValue(o)asIDictionary; Typekey=field.FieldType.IsGenericType? field.FieldType.GetGenericArgumen
此文档下载收益归作者所有