[转]自定义序列化对象

时间:2022-06-17 15:56:42
[转]自定义序列化对象很多时候,我们需要将对象序列化成字符串保存到内存、磁盘或者 Page.ViewState 中。基于种种原因,我们希望序列化结果尽可能小,尽可能简单,即便用其他的方法(比如正则表达式)也能解析出数据。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 - 11);
[转]自定义序列化对象      }

[转]自定义序列化对象      
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 - 11);
[转]自定义序列化对象      }

[转]自定义序列化对象      
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 - 11);
[转]自定义序列化对象  
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<stringint> dictionary;
[转]自定义序列化对象
[转]自定义序列化对象  
public Dictionary<stringint> 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<stringint>();
[转]自定义序列化对象    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);
[转]自定义序列化对象  }

[转]自定义序列化对象}