翻看MSDN,关于对象序列化的示例最常见的都是在文件流中进行XML序列化,因为开发的需要,我必须要在内存流中将对象以二进制方式序列化,原以为很简单,copy一下示例改改就好了,原代码如下:#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
public sealed class Serializer#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
private Serializer() { }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
public static string SerializeObject(object obj)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
{            #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        IFormatter formatter
= new BinaryFormatter(); #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
string result = string.Empty;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
using (MemoryStream stream = new MemoryStream())#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            formatter.Serialize(stream, obj);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
           
byte[] byt = new byte[stream.Length];#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            byt
= stream.ToArray();#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            result
= Encoding.UTF8.GetString(byt, 0, byt.Length);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
          #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            stream.Flush();                #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
return result;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
public static
object DeserializeObject(string str)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
{        #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        IFormatter formatter
= new BinaryFormatter();#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
byte[] byt = Encoding.UTF8.GetBytes(str);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
object obj = null;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
using (Stream stream = new MemoryStream(byt, 0, byt.Length))#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            obj
= formatter.Deserialize(stream);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
return obj;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
}
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        谁想到在单元测试的时候却是报忧不报喜啊,错误信息是这样:SerializerTest.SerializeObjectTest 引发异常:#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
System.Runtime.Serialization.SerializationException: 二进制流“0”不包含有效的BinaryHeader。这可能是由于无效流,或由于在序列化和反序列化之间的对象版本更改。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        经过debug,发现SerializeObject方法中,"result = Encoding.UTF8.GetString(byt, 0, byt.Length);"此行代码运行过后,result的值居然是"\0\0\0……"一大串开头,难怪会报错的。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        此后我只是将BinaryFormatter换成XMlSerializer其他的不变,那倒是能正常得到结果的,可那不是我想要的啊,总是问题之关键在于将byte数组转为string时的字符串,所以接下来我先后用gb2312,ansi,unicode等Encoding来转换均无果,后来在Convert类中找到一个方法,修改后的代码如下:#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
public sealed class Serializer#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
private Serializer() { }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
public static string SerializeObject(object obj)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        IFormatter formatter
= new BinaryFormatter(); #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
string result = string.Empty;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
using (MemoryStream stream = new MemoryStream())#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            formatter.Serialize(stream, obj);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
           
byte[] byt = new byte[stream.Length];#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            byt
= stream.ToArray();              #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
           
//result = Encoding.UTF8.GetString(byt, 0, byt.Length);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            result = Convert.ToBase64String(byt);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            stream.Flush();                #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
return result;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
public static object DeserializeObject(string str)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        IFormatter formatter
= new BinaryFormatter();#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
//byte[] byt = Encoding.UTF8.GetBytes(str);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
byte[] byt = Convert.FromBase64String(str);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
object obj = null;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
using (Stream stream = new MemoryStream(byt, 0, byt.Length))#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            obj
= formatter.Deserialize(stream);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
return obj;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    }
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
}
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        再次单元测试通过了,说明修改有效,回头debug到“result = Convert.ToBase64String(byt);”,result的值开头没有"\0"了,都是字母,这才证明了序列化成功的原因。之后对基于64位的字符串转换应该多加关注,往往能起到令人惊喜的效果,本案总算是结案了。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®