[转]自定义序列化对象
生活随笔
收集整理的這篇文章主要介紹了
[转]自定义序列化对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多時候,我們需要將對象序列化成字符串保存到內存、磁盤或者?Page.ViewState?中?;诜N種原因,我們希望序列化結果盡可能小,盡可能簡單,即便用其他的方法(比如正則表達式)也能解析出數據。BinaryFormatter?的結果轉換成字符串(或者Base64)長度太大,而?XmlSerializer?對數據類型支持有限,顯然內置的序列化引擎不足以滿足我們的需求,還是自己豐衣足食。
下面的代碼可能還不完善,僅供參考,內容比較簡單,不做詳述。
/**////?<summary>
///?序列化
///?</summary>
public?static?string?SerializeObject(object?o)
{
??char?sep1?=?'|';
??char?sep2?=?',';
??char?sep3?=?'=';
??StringBuilder?sb?=?new?StringBuilder();
??FieldInfo[]?fields?=?o.GetType().GetFields(BindingFlags.Instance?|?BindingFlags.Public?|?
????BindingFlags.NonPublic);
??foreach?(FieldInfo?field?in?fields)
??{
????object?value?=?field.GetValue(o);
????if?(value?!=?null)
????{
??????if?(field.FieldType.GetInterface("IDictionary")?!=?null)
??????{
????????foreach?(object?key?in?(value?as?IDictionary).Keys)
????????{
??????????sb.AppendFormat("{0}{3}{1}{2}",?key,?(value?as?IDictionary)[key],?sep2,?sep3);
????????}
????????if?(sb[sb.Length?-?1]?==?sep2)?sb.Remove(sb.Length?-?1,?1);
??????}
??????else?if?(field.FieldType.GetInterface("IList")?!=?null)
??????{
????????foreach?(object?v?in?(value?as?IList))
????????{
??????????sb.AppendFormat("{0}{1}",?v,?sep2);
????????}
????????if?(sb[sb.Length?-?1]?==?sep2)?sb.Remove(sb.Length?-?1,?1);
??????}
??????else?if?(field.FieldType?==?typeof(Boolean))
??????{
????????sb.Append((bool)value???"T"?:?"");
??????}
??????else
??????{
????????sb.Append(value);
??????}
????}
????sb.Append(sep1);
??}
??if?(sb[sb.Length?-?1]?==?sep1)?sb.Remove(sb.Length?-?1,?1);
??return?sb.ToString();
}
/**////?<summary>
///?反序列化
///?</summary>
public?static?T?DeserializeObject<T>(string?s)
??where?T?:?new()
{
??char?sep1?=?'|';
??char?sep2?=?',';
??char?sep3?=?'=';
??T?o?=?new?T();
??FieldInfo[]?fields?=?o.GetType().GetFields(BindingFlags.Instance?|?BindingFlags.Public?|?
????BindingFlags.NonPublic);
??string[]?values?=?s.Split(sep1);
??for?(int?i?=?0;?i?<?fields.Length;?i++)
??{
????FieldInfo?field?=?fields[i];
????if?(String.IsNullOrEmpty(values[i]))?continue;
????if?(field.FieldType.GetInterface("IDictionary")?!=?null)
????{
??????string[]?vs?=?values[i].Split(sep2);
??????IDictionary?dictionary?=?field.GetValue(o)?as?IDictionary;
??????Type?key?=?field.FieldType.IsGenericType???
????????field.FieldType.GetGenericArguments()[0]?:?typeof(Object);
??????Type?value?=?field.FieldType.IsGenericType???
????????field.FieldType.GetGenericArguments()[1]?:?typeof(Object);
??????if?(dictionary?==?null)
??????{
????????dictionary?=?(IDictionary)Activator.CreateInstance(field.FieldType);
????????field.SetValue(o,?dictionary);
??????}
??????foreach?(string?v?in?vs)
??????{
????????string[]?ns?=?v.Split(sep3);
????????dictionary.Add(Convert.ChangeType(ns[0],?key),?Convert.ChangeType(ns[1],?value));
??????}
????}
????else?if?(field.FieldType.GetInterface("IList")?!=?null)
????{
??????string[]?vs?=?values[i].Split(sep2);
??????if?(field.FieldType.IsArray)
??????{
????????Type?t?=?field.FieldType.GetElementType();
????????Array?array?=?Array.CreateInstance(t,?vs.Length);
????????for?(int?x?=?0;?x?<?vs.Length;?x++)
????????{
??????????array.SetValue(Convert.ChangeType(vs[x],?t),?x);
????????}
????????field.SetValue(o,?array);
??????}
??????else
??????{
????????IList?list?=?field.GetValue(o)?as?IList;
????????Type?t?=?field.FieldType.IsGenericType???
??????????field.FieldType.GetGenericArguments()[0]?:?typeof(Object);
????????if?(list?==?null)
????????{
??????????list?=?(IList)Activator.CreateInstance(field.FieldType);
??????????field.SetValue(o,?list);
????????}
????????foreach?(string?v?in?vs)
????????{
??????????list.Add(Convert.ChangeType(v,?t));
????????}
??????}
????}
????else?if?(field.FieldType?==?typeof(Boolean))
????{
??????field.SetValue(o,?values[i]?==?"T"???true?:?false);
????}
????else?if?(field.FieldType.IsEnum)
????{
??????field.SetValue(o,?Enum.Parse(field.FieldType,?values[i],?true));
????}
????else
????{
??????field.SetValue(o,?Convert.ChangeType(values[i],?field.FieldType));
????}
??}
??return?o;
}
測試代碼
[Serializable]
public?class?MyClass
{
??private?int?valueType;
??public?int?ValueType
??{
????get?{?return?valueType;?}
????set?{?valueType?=?value;?}
??}
??private?object?obj;
??public?object?Object
??{
????get?{?return?obj;?}
????set?{?obj?=?value;?}
??}
??private?bool?boolean;
??public?bool?Boolean
??{
????get?{?return?boolean;?}
????set?{?boolean?=?value;?}
??}
??private?string[]?array;
??public?string[]?Array
??{
????get?{?return?array;?}
????set?{?array?=?value;?}
??}
??private?List<string>?list;
??public?List<string>?List
??{
????get?{?return?list;?}
????set?{?list?=?value;?}
??}
??private?ArrayList?arrayList;
??public?ArrayList?ArrayList
??{
????get?{?return?arrayList;?}
????set?{?arrayList?=?value;?}
??}
??private?Hashtable?hashtable;
??public?Hashtable?Hashtable
??{
????get?{?return?hashtable;?}
????set?{?hashtable?=?value;?}
??}
??private?Dictionary<string,?int>?dictionary;
??public?Dictionary<string,?int>?Dictionary
??{
????get?{?return?dictionary;?}
????set?{?dictionary?=?value;?}
??}
}
class?Program
{
??static?void?Main(string[]?args)
??{
????//Test();
????MyClass?o?=?new?MyClass();
????o.List?=?new?List<string>();
????o.Dictionary?=?new?Dictionary<string,?int>();
????o.ArrayList?=?new?ArrayList();
????o.Hashtable?=?new?Hashtable();
????o.ValueType?=?123456;
????o.Object?=?DateTime.Now;
????o.Boolean?=?true;
????o.Dictionary.Add("dict1",?1);
????o.Dictionary.Add("dict2",?2);
????
????o.Array?=?new?string[]?{?"array1",?"array2",?"array3"?};
????
????o.List.Add("list1");
????o.List.Add("list2");
????
????o.ArrayList.Add("ArrayList1");
????o.ArrayList.Add("ArrayList2");
????
????o.Hashtable.Add("Hashtable1",?1);
????o.Hashtable.Add("Hashtable2",?2);
????//?SerializeObject
????string?s?=?SerializeObject(o);
????Console.WriteLine(s);
????MyClass?m?=?DeserializeObject<MyClass>(s);
????Console.WriteLine(SerializeObject(m));
????//?BinaryFormatter
????BinaryFormatter?binary?=?new?BinaryFormatter();
????MemoryStream?stream?=?new?MemoryStream();
????binary.Serialize(stream,?o);
????s?=?Convert.ToBase64String(stream.ToArray());
????Console.WriteLine(s);
??}
}
下面的代碼可能還不完善,僅供參考,內容比較簡單,不做詳述。
/**////?<summary>
///?序列化
///?</summary>
public?static?string?SerializeObject(object?o)
{
??char?sep1?=?'|';
??char?sep2?=?',';
??char?sep3?=?'=';
??StringBuilder?sb?=?new?StringBuilder();
??FieldInfo[]?fields?=?o.GetType().GetFields(BindingFlags.Instance?|?BindingFlags.Public?|?
????BindingFlags.NonPublic);
??foreach?(FieldInfo?field?in?fields)
??{
????object?value?=?field.GetValue(o);
????if?(value?!=?null)
????{
??????if?(field.FieldType.GetInterface("IDictionary")?!=?null)
??????{
????????foreach?(object?key?in?(value?as?IDictionary).Keys)
????????{
??????????sb.AppendFormat("{0}{3}{1}{2}",?key,?(value?as?IDictionary)[key],?sep2,?sep3);
????????}
????????if?(sb[sb.Length?-?1]?==?sep2)?sb.Remove(sb.Length?-?1,?1);
??????}
??????else?if?(field.FieldType.GetInterface("IList")?!=?null)
??????{
????????foreach?(object?v?in?(value?as?IList))
????????{
??????????sb.AppendFormat("{0}{1}",?v,?sep2);
????????}
????????if?(sb[sb.Length?-?1]?==?sep2)?sb.Remove(sb.Length?-?1,?1);
??????}
??????else?if?(field.FieldType?==?typeof(Boolean))
??????{
????????sb.Append((bool)value???"T"?:?"");
??????}
??????else
??????{
????????sb.Append(value);
??????}
????}
????sb.Append(sep1);
??}
??if?(sb[sb.Length?-?1]?==?sep1)?sb.Remove(sb.Length?-?1,?1);
??return?sb.ToString();
}
/**////?<summary>
///?反序列化
///?</summary>
public?static?T?DeserializeObject<T>(string?s)
??where?T?:?new()
{
??char?sep1?=?'|';
??char?sep2?=?',';
??char?sep3?=?'=';
??T?o?=?new?T();
??FieldInfo[]?fields?=?o.GetType().GetFields(BindingFlags.Instance?|?BindingFlags.Public?|?
????BindingFlags.NonPublic);
??string[]?values?=?s.Split(sep1);
??for?(int?i?=?0;?i?<?fields.Length;?i++)
??{
????FieldInfo?field?=?fields[i];
????if?(String.IsNullOrEmpty(values[i]))?continue;
????if?(field.FieldType.GetInterface("IDictionary")?!=?null)
????{
??????string[]?vs?=?values[i].Split(sep2);
??????IDictionary?dictionary?=?field.GetValue(o)?as?IDictionary;
??????Type?key?=?field.FieldType.IsGenericType???
????????field.FieldType.GetGenericArguments()[0]?:?typeof(Object);
??????Type?value?=?field.FieldType.IsGenericType???
????????field.FieldType.GetGenericArguments()[1]?:?typeof(Object);
??????if?(dictionary?==?null)
??????{
????????dictionary?=?(IDictionary)Activator.CreateInstance(field.FieldType);
????????field.SetValue(o,?dictionary);
??????}
??????foreach?(string?v?in?vs)
??????{
????????string[]?ns?=?v.Split(sep3);
????????dictionary.Add(Convert.ChangeType(ns[0],?key),?Convert.ChangeType(ns[1],?value));
??????}
????}
????else?if?(field.FieldType.GetInterface("IList")?!=?null)
????{
??????string[]?vs?=?values[i].Split(sep2);
??????if?(field.FieldType.IsArray)
??????{
????????Type?t?=?field.FieldType.GetElementType();
????????Array?array?=?Array.CreateInstance(t,?vs.Length);
????????for?(int?x?=?0;?x?<?vs.Length;?x++)
????????{
??????????array.SetValue(Convert.ChangeType(vs[x],?t),?x);
????????}
????????field.SetValue(o,?array);
??????}
??????else
??????{
????????IList?list?=?field.GetValue(o)?as?IList;
????????Type?t?=?field.FieldType.IsGenericType???
??????????field.FieldType.GetGenericArguments()[0]?:?typeof(Object);
????????if?(list?==?null)
????????{
??????????list?=?(IList)Activator.CreateInstance(field.FieldType);
??????????field.SetValue(o,?list);
????????}
????????foreach?(string?v?in?vs)
????????{
??????????list.Add(Convert.ChangeType(v,?t));
????????}
??????}
????}
????else?if?(field.FieldType?==?typeof(Boolean))
????{
??????field.SetValue(o,?values[i]?==?"T"???true?:?false);
????}
????else?if?(field.FieldType.IsEnum)
????{
??????field.SetValue(o,?Enum.Parse(field.FieldType,?values[i],?true));
????}
????else
????{
??????field.SetValue(o,?Convert.ChangeType(values[i],?field.FieldType));
????}
??}
??return?o;
}
測試代碼
[Serializable]
public?class?MyClass
{
??private?int?valueType;
??public?int?ValueType
??{
????get?{?return?valueType;?}
????set?{?valueType?=?value;?}
??}
??private?object?obj;
??public?object?Object
??{
????get?{?return?obj;?}
????set?{?obj?=?value;?}
??}
??private?bool?boolean;
??public?bool?Boolean
??{
????get?{?return?boolean;?}
????set?{?boolean?=?value;?}
??}
??private?string[]?array;
??public?string[]?Array
??{
????get?{?return?array;?}
????set?{?array?=?value;?}
??}
??private?List<string>?list;
??public?List<string>?List
??{
????get?{?return?list;?}
????set?{?list?=?value;?}
??}
??private?ArrayList?arrayList;
??public?ArrayList?ArrayList
??{
????get?{?return?arrayList;?}
????set?{?arrayList?=?value;?}
??}
??private?Hashtable?hashtable;
??public?Hashtable?Hashtable
??{
????get?{?return?hashtable;?}
????set?{?hashtable?=?value;?}
??}
??private?Dictionary<string,?int>?dictionary;
??public?Dictionary<string,?int>?Dictionary
??{
????get?{?return?dictionary;?}
????set?{?dictionary?=?value;?}
??}
}
class?Program
{
??static?void?Main(string[]?args)
??{
????//Test();
????MyClass?o?=?new?MyClass();
????o.List?=?new?List<string>();
????o.Dictionary?=?new?Dictionary<string,?int>();
????o.ArrayList?=?new?ArrayList();
????o.Hashtable?=?new?Hashtable();
????o.ValueType?=?123456;
????o.Object?=?DateTime.Now;
????o.Boolean?=?true;
????o.Dictionary.Add("dict1",?1);
????o.Dictionary.Add("dict2",?2);
????
????o.Array?=?new?string[]?{?"array1",?"array2",?"array3"?};
????
????o.List.Add("list1");
????o.List.Add("list2");
????
????o.ArrayList.Add("ArrayList1");
????o.ArrayList.Add("ArrayList2");
????
????o.Hashtable.Add("Hashtable1",?1);
????o.Hashtable.Add("Hashtable2",?2);
????//?SerializeObject
????string?s?=?SerializeObject(o);
????Console.WriteLine(s);
????MyClass?m?=?DeserializeObject<MyClass>(s);
????Console.WriteLine(SerializeObject(m));
????//?BinaryFormatter
????BinaryFormatter?binary?=?new?BinaryFormatter();
????MemoryStream?stream?=?new?MemoryStream();
????binary.Serialize(stream,?o);
????s?=?Convert.ToBase64String(stream.ToArray());
????Console.WriteLine(s);
??}
}
總結
以上是生活随笔為你收集整理的[转]自定义序列化对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你安装VMware虚拟机
- 下一篇: 近期吉他练习曲目《爱的罗曼史》,安排每天