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類中找到一個方法,修改後的代碼如下:
{
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位的字符串轉換應該多加關注,往往能起到令人驚喜的效果,本案總算是結案了。