私はオブジェクトのカスタムシリアル化/逆シリアル化を行い、DeflateStreamsを使ってシリアル化されたデータを圧縮/解凍しようとしています。もともと私はもっと複雑なオブジェクトのためにこれをやっていましたが、問題を解明しようと努力しましたが、それがまだ残っているので困惑しました。ここで非直列化/直列化されるクラスは、次のとおりです。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();
}
今、問題に。 Deserializationは、メッセージ「{"オブジェクトのマップがありません '201326592'}でSerializationExceptionをスローします。どのようにトラブルシューティングを行うか、または問題の原因を正確に把握する方法はわかりません。非常に基本的な直列化は、BinaryFormatterのSerializeメソッドとDeserializeメソッドを同じMemoryStreamで実行するときに機能します。
私は両方のメソッドからDeflateStreamを削除しようとしましたが、それでも同じ問題があります。 MSDNや他の場所のサンプルを見ると、正しく動作しているように見えますが、例外メッセージのグーグルでは意味のある結果は得られません。
PS。あなたが見ることができるように、私はsrc.CopyTo(dest)を全く動かすことができないので、私は基本的なストリームコピー機であるMiscellaneous.CopyStream(src、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の問題?なぜそれは失敗するのですか? –
どのようにそれを使用するにせよ、宛先ストリームは常に空ですが、私は何かばかげているかもしれません。 – vesz