オブジェクトのカスタムのシリアル化/逆シリアル化を行い、シリアル化されたデータを 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();
}
さて、問題に。デシリアライゼーションは、{"オブジェクト '201326592' のマップがありません。"} というメッセージとともに SerializationException をスローします。トラブルシューティングの方法や、問題の原因を正確に突き止める方法がわかりません。BinaryFormatter の Serialize メソッドと Deserialize メソッドを同じ MemoryStream で実行すると、非常に基本的なシリアル化が機能します。
両方のメソッドから DeflateStream のものを削除しようとしましたが、それでも同じ問題です。MSDN や他の場所の例を見ると、私はそれを正しく行っているように見え、例外メッセージをグーグルで調べても意味のある結果が得られません (または、検索が下手なだけかもしれません)。
PS。ご覧のとおり、 src.CopyTo(dest) をまったく機能させることができないため、基本的なストリームコピーである Miscellaneous.CopyStream(src, dest) を使用しているため、そのヒントも歓迎します。
以下は、VS2010 プロジェクト全体へのリンクです。詳しく調べたい場合は、 http ://www.diredumplings.com/SerializationTesting.zip を参照してください。
アップデート:
The_Smallest : シリアライゼーションに投稿した Compress メソッドを使用してみました:
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();
}
お二人ともありがとう!