gpt4 book ai didi

C# 自定义序列化/反序列化以及 DeflateStreams

转载 作者:太空狗 更新时间:2023-10-29 23:34:44 24 4
gpt4 key购买 nike

我正在尝试对对象进行自定义序列化/反序列化,以及使用 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 的序列化和反序列化方法时,非常基本的序列化工作。

我尝试从这两种方法中删除 DeflateStream 的东西,但它仍然是同样的问题。当我查看 MSDN 和其他地方的示例时,看起来我做的恰到好处,用谷歌搜索异常消息并没有给出任何有意义的结果(或者我可能只是不擅长搜索)。

附言。如您所见,我使用的是 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 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();
}

谢谢你们!

最佳答案

我下载了您的示例并在其中进行了一些研究。在下面查看您的项目的更改:

  1. 替换Loader.cli中的LoadFromFile>
private static RandomObject LoadFromFile(string path)
{
try
{
var bf = new BinaryFormatter();
using (var fileStream = File.OpenRead(path))
using (var decompressed = new MemoryStream())
{
using (var deflateStream = new DeflateStream(fileStream, CompressionMode.Decompress))
deflateStream.CopyTo(decompressed);

decompressed.Seek(0, SeekOrigin.Begin);
var profile = (RandomObject)bf.Deserialize(decompressed);
profile.SavePath = path;
return profile;
}
}
catch (IOException e)
{
MessageBox.Show(e.Message);
return null;
}
}
  1. Replace Save in Saver.cs as follows:
public static bool Save(RandomObject profile, String path)
{
try
{
var bf = new BinaryFormatter();
using (var uncompressed = new MemoryStream())
using (var fileStream = File.Create(path))
{
bf.Serialize(uncompressed, profile);
uncompressed.Seek(0, SeekOrigin.Begin);

using (var deflateStream = new DeflateStream(fileStream, CompressionMode.Compress))
uncompressed.CopyTo(deflateStream);
}
return true;
}
catch (IOException e)
{
MessageBox.Show(e.Message);
return false;
}
}

关于C# 自定义序列化/反序列化以及 DeflateStreams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com