在内存流中对象的二进制序列化的问题

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位的字符串转换应该多加关注,往往能起到令人惊喜的效果,本案总算是结案了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值