反序列化字节数组

Jou*_*usi 13 c# binary managed deserialization

如果我想从二进制文件填充结构,我会使用这样的东西:

using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
{
    myStruct.ID = br.ReadSingle();
    myStruct.name = br.ReadBytes(20);
}
Run Code Online (Sandbox Code Playgroud)

但是,我必须在反序列化之前将整个文件读入一个字节数组,因为我想做一些预处理.是否有任何托管方式从字节数组填充我的结构,最好类似于上面的那个?

Gle*_*rie 17

这是采取一些数据(实际上是一个System.Data.DataSet中)和序列化到一个字节数组,同时使用DeflateStream压缩的样品.

try
{
    var formatter = new BinaryFormatter();
    byte[] content;
    using (var ms = new MemoryStream())
    {
         using (var ds = new DeflateStream(ms, CompressionMode.Compress, true))
         {
             formatter.Serialize(ds, set);
         }
         ms.Position = 0;
         content = ms.GetBuffer();
         contentAsString = BytesToString(content);
     }
}
catch (Exception ex) { /* handle exception omitted */ }
Run Code Online (Sandbox Code Playgroud)

以下是反序列化的代码:

        var set = new DataSet();
        try
        {
            var content = StringToBytes(s);
            var formatter = new BinaryFormatter();
            using (var ms = new MemoryStream(content))
            {
                using (var ds = new DeflateStream(ms, CompressionMode.Decompress, true))
                {
                    set = (DataSet)formatter.Deserialize(ds);                        
                }
            }
        }
        catch (Exception ex)
        {
            // removed error handling logic!
        }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.正如Nate暗示的那样,我们在这里使用MemoryStream.

  • 投掷压缩的+1,只是因为你可以 (2认同)
  • @Angel 作为记录,我强烈建议***反对*** BinaryFormatter 用于*任何*类型的存储。它有几个令人讨厌的怪癖,老实说,我已经记不清有多少次我不得不帮助人们处理丢失的数据等问题。存在其他序列化程序(IMO,基于序列化方面的大量工作)更强大,只是一个方便,CPU 和带宽效率更高。 (2认同)