首页 > 解决方案 > 将 BinarySerialized 字节数组转换为可读字符串

问题描述

当您使用 BinaryFormatter 在 .Net 中对对象进行二进制序列化时,您最终会得到一个字节数组,这对人类来说显然毫无意义。

这个字节数组是否对应于人类可读的更有意义的字符串表示?或者您是否需要完全反序列化它以使其更具人类可读性?

我希望二进制格式化程序在发出字节数组之前具有它使用的对象的一些中间字符串表示形式。这对我的需求来说是完美的......

我尝试使用 Base64 对字节数组进行编码,但结果却是乱码。

编辑:

正如我在回答中所解释的,UTF8 编码是你能得到的最好的。

我想这样做的原因是我可以区分两个二进制序列化并只存储第一个序列化和差异,并且有兴趣了解序列化是如何工作的,以便找出如何最好地区分字节数组。

标签: c#.netbinaryformatterbinary-serialization

解决方案


如何分析二进制序列化流的内容?更详细地讨论了二进制序列化的格式,并且还提供了到各种分析器的链接。

没有完全人类可读的中间表示,但 usingConsole.WriteLine(System.Text.Encoding.UTF8.GetString(bytes));将返回可能可行的东西,具体取决于所需的确切目的。

请注意,只有部分字节可以使用 UTF8 解码,因为只有部分字节数组是 UTF8 编码的。结果字符串中会有很多未找到的符号。

例如,序列化以下内容并将结果转换为 UTF8 字符串:

namespace MyNamespace
{
    [Serializable]
    public class Class
    {
        private readonly int _int = 42;

        public string String { get; } = "MyString";
    }
}

结果是:

"    ????          ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   MyNamespace.Class   _int<String>k__BackingField   *    MyString"

这不是完全没用...


推荐阅读