Я пытаюсь выполнить пользовательскую сериализацию/десериализацию объекта, а также сжать/распаковать сериализованные данные с помощью 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 с сообщением {"Нет карты для объекта '201326592'."} Я понятия не имею, как устранить неполадки или выяснить, что именно вызывает проблему. Очень простая сериализация работает, когда я просто запускаю методы Serialize и Deserialize BinaryFormatter в одном и том же MemoryStream.
Я попытался удалить материал DeflateStream из обоих методов, но это все та же проблема. Когда я смотрю на примеры в MSDN и других местах, кажется, что я все делаю правильно, и поиск сообщения об исключении не дает никаких значимых результатов (или, возможно, я просто плохо ищу).
PS. Как видите, я использую Miscellaneous.CopyStream(src, dest), который является базовым потоковым копировщиком, так как я не могу заставить src.CopyTo(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 КБ, когда я пытаюсь сохранить его на диск. Любые идеи?
Питер: я удалил 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();
}
Спасибо вам обоим!