序列化的使用技巧

VS2003 中用 BinaryFormater 来序列化一个对象时会有这样的情况存在。从一时期版本的已序列化对象进行对象创建时会因字 段的增加而出现异常。通过查阅 MSDN 可以得知通过自定义序列化处理。
       在将对象序列化之前,最好先做下面的事情,将聚合的对象尽量置空( null )否则序列化后的结果可能会很大!将事件置空!否则序列化过程中要求事件订阅者的元数据 ( 即元数据也要序列化 )
        在VS2003中序列化CollectionBase继承的类时会产生问题,解决的办法是实现其索引器方法。
         对多维数组直接进行XML序列化时也会出现问题,解决的办法是将其转换为数组的数组。
       下面是自定义序列化的实现方法: (2005 VS.net 已经提供了类似的功能,不需要现这样做了: ))
     public   class  Serialize
    
{
        
public static void DoSerialize(SerializationInfo info, StreamingContext context,object obj)
        
{
            
foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            
{
                
try            // 一定要放于foreach的里边,否则会丢失成员信息
                {
                    
string s = fi.Name;
                    
object o = fi.GetValue(obj);
                    info.AddValue(s,o);
                }

                
catch(Exception e)
                
{
                    MessageBox.Show(e.ToString());            
                }

            }

        }

        
public static void DeSerialize(SerializationInfo info, StreamingContext context, object obj)
        
{
            
foreach(FieldInfo fi in obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            
{
                
try            // 一定要放于foreach的里边,否则会丢失成员信息
                {
                    
string s = fi.Name;
                    
object o = info.GetValue(s,fi.FieldType);
                    fi.SetValue(obj,o);
                }

                
catch(Exception){}
            }

        }

        
public static byte[] ToBytes(object obj)
        
{
            
try
            
{
                
// 进行序列化操作
                MemoryStream ms = new MemoryStream();
                BinaryFormatter serializer 
= new BinaryFormatter();
                serializer.Serialize(ms,obj);
                
return ms.ToArray();
            }

            
catch(Exception e)
            
{
                MessageBox.Show(e.ToString());
                
return null;
            }

        }


        
public static object ToObject(byte[] ary)
        
{
            
try
            
{
                
// 进行反序列化操作
                MemoryStream ms = new MemoryStream(ary);
                ms.Position 
= 0;
                BinaryFormatter serializer 
= new BinaryFormatter();
                
return serializer.Deserialize(ms);
            }

            
catch(Exception e)
            
{
                MessageBox.Show(e.ToString());
                
return null;
            }

        }

    }

          使用的例子如下:
    [Serializable()]
    
public   class  ProjectOptions : ISerializable
    {
        
//  成员声明 
\        …
        
//  下面这一行是必须的,即使没有内容也要有一个构造函数
         public  ProjectOptions() {}

        
#region  ISerializable 成员
        
public  ProjectOptions(SerializationInfo info, StreamingContext context)
        {
            Serialize.DeSerialize(info,context,
this );
        }
        
public   void  GetObjectData(SerializationInfo info, StreamingContext context)
        {
            Serialize.DoSerialize(info,context,
this );
        }
        
#endregion
    }

你可能感兴趣的:(序列化)