我正在嘗試執行對象的自定義序列化/反序列化以及使用DeflateStreams壓縮/解壓縮序列化的數據。我原本是爲了處理更復雜的對象而做的,但是爲了試圖找出問題而做了一些嘗試,但是由於它仍然存在,它變得更加令人費解。這裏是要序列化的類/反序列化:C#自定義序列化/反序列化與DeflateStreams
[Serializable]
public class RandomObject : ISerializable
{
public String Name { get; set; }
public String SavePath { get; set; }
public RandomObject()
{
}
public RandomObject(String name, String savepath)
{
Name = name;
SavePath = savepath;
}
public RandomObject(SerializationInfo info, StreamingContext context)
: this(info.GetString("name"), info.GetString("savepath"))
{
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("name", Name);
info.AddValue("savepath", SavePath);
}
}
這裏是應該序列化(這似乎工作)代碼:
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, profile);
using (DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress))
{
try
{
using (FileStream fs = File.Create(path))
{
ds.Flush();
Miscellaneous.CopyStream(ds.BaseStream, fs);
fs.Flush();
fs.Close();
}
}
catch (IOException e)
{
MessageBox.Show(e.Message);
success = false;
}
ds.Close();
}
ms.Close();
}
,這裏是反序列化:
RandomObject profile = null;
using (FileStream fs = File.OpenRead(path))
{
using (DeflateStream ds = new DeflateStream(fs, CompressionMode.Decompress))
{
BinaryFormatter bf = new BinaryFormatter();
ds.Flush();
using (MemoryStream ms = new MemoryStream())
{
Miscellaneous.CopyStream(ds.BaseStream, ms);
profile = bf.Deserialize(ms) as RandomObject;
profile.SavePath = path;
ms.Close();
}
ds.Close();
}
fs.Close();
}
現在,解決問題。反序列化拋出一個SerializationException,並帶有消息{「No map for object'201326592'。」}我不知道如何解決問題或弄清究竟是什麼導致了問題。當我在同一個MemoryStream上運行BinaryFormatter的Serialize和Deserialize方法時,非常基本的序列化工作。
我試圖從兩種方法中刪除DeflateStream的東西,但它仍然是同樣的問題。當我看到MSDN和其他地方的示例時,它看起來像我做得很恰當,並且使用Google搜尋異常消息不會給出任何有意義的結果(或者我可能只是在搜索時遇到不好的情況)。
PS。正如你所看到的,我使用Miscellaneous.CopyStream(src,dest),它是一個基本的流複製器,因爲我無法獲得src.CopyTo(dest)的功能,所以我們也歡迎任何提示。
下面是一個鏈接到整個VS2010項目,如果你想更仔細地看: http://www.diredumplings.com/SerializationTesting.zip
UPDATE:
The_Smallest:我試着用你貼在壓縮方法我係列化:
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
bf.Serialize(stream, profile);
byte[] array = Compress(stream);
using (MemoryStream ms = new MemoryStream(array))
{
using (FileStream fs = File.Create(path))
{
ms.WriteTo(fs);
fs.Flush();
}
}
}
然而,這似乎給我,我和srcStream.CopyTo(destStream)早前曾同樣的問題,這是它似乎沒有寫入流中。當我嘗試將它保存到磁盤時,結果是一個0 kb的文件。有任何想法嗎?
Pieter:我從反序列化方法中刪除了MemoryStream,它看起來具有和以前相同的功能。但是我不確定如何按照您的建議來實現序列化。這是你想到的嗎?
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fs = File.Create(path))
{
using (DeflateStream ds = new DeflateStream(fs, CompressionMode.Compress))
{
bf.Serialize(ds, profile);
fs.Flush();
ds.Close();
}
fs.Close();
}
感謝你們倆!
什麼是Stream.Copy的問題?它爲什麼會失敗? – 2010-11-28 17:03:16
無論我如何使用它,目標流總是空的,可能只是我做了一些愚蠢的事情。 – vesz 2010-11-28 18:19:14