在內存流中對象的二進制序列化的問題

http://www.cnblogs.com/shouzheng/archive/2009/03/17/901866.html

 

public   sealed   class  Serializer
{
    
private  Serializer()  { }

    
public   static   string  SerializeObject( object  obj)
    
{            
        IFormatter formatter 
=   new  BinaryFormatter(); 
        
string  result  =   string .Empty;
        
using  (MemoryStream stream  =   new  MemoryStream())
        
{
            formatter.Serialize(stream, obj);

            
byte [] byt  =   new   byte [stream.Length];
            byt 
=  stream.ToArray();
            result 
=  Encoding.UTF8.GetString(byt,  0 , byt.Length);
           
            stream.Flush();                
        }

        
return  result;
    }


    
public   static   object  DeserializeObject( string  str)
    
{         
        IFormatter formatter 
=   new  BinaryFormatter();
        
byte [] byt  =  Encoding.UTF8.GetBytes(str);
     
        
object  obj  =   null ;
        
using  (Stream stream  =   new  MemoryStream(byt,  0 , byt.Length))
        
{
            obj 
=  formatter.Deserialize(stream);
        }

        
return  obj;
    }

}

        誰想到在單元測試的時候卻是報憂不報喜啊,錯誤信息是這樣:SerializerTest.SerializeObjectTest 引發異常:

System.Runtime.Serialization.SerializationException: 二進制流“0”不包含有效的BinaryHeader。這可能是由於無效流,或由於在序列化和反序列化之間的對象版本更改。

        經過debug,發現SerializeObject方法中,"result = Encoding.UTF8.GetString(byt, 0, byt.Length);"此行代碼運行過後,result的值居然是"/0/0/0……"一大串開頭,難怪會報錯的。
        此後我只是將BinaryFormatter換成XMlSerializer其他的不變,那倒是能正常得到結果的,可那不是我想要的啊,總是問題之關鍵在 於將byte數組轉爲string時的字符串,所以接下來我先後用gb2312,ansi,unicode等Encoding來轉換均無果,後來在 Convert類中找到一個方法,修改後的代碼如下:

public   sealed   class  Serializer
{
    
private  Serializer()  { }

    
public   static   string  SerializeObject( object  obj)
    
{
        IFormatter formatter 
=   new  BinaryFormatter(); 
        
string  result  =   string .Empty;
        
using  (MemoryStream stream  =   new  MemoryStream())
        
{
            formatter.Serialize(stream, obj);

            
byte [] byt  =   new   byte [stream.Length];
            byt 
=  stream.ToArray();               
            
// result = Encoding.UTF8.GetString(byt, 0, byt.Length);
            result  =  Convert.ToBase64String(byt);
            stream.Flush();                
        }

        
return  result;
    }


    
public   static   object  DeserializeObject( string  str)
    
{
        IFormatter formatter 
=   new  BinaryFormatter();
        
// byte[] byt = Encoding.UTF8.GetBytes(str);
         byte [] byt  =  Convert.FromBase64String(str);
        
object  obj  =   null ;
        
using  (Stream stream  =   new  MemoryStream(byt,  0 , byt.Length))
        
{
            obj 
=  formatter.Deserialize(stream);
        }

        
return  obj;
    }

}

        再次單元測試通過了,說明修改有效,回頭debug到“result = Convert.ToBase64String(byt);”,result的值開頭沒有"/0"了,都是字母,這才證明了序列化成功的原因。之後對基於 64位的字符串轉換應該多加關注,往往能起到令人驚喜的效果,本案總算是結案了。

發佈了14 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章