c# - 将 BinarySerialized 字节数组转换为可读字符串
问题描述
当您使用 BinaryFormatter 在 .Net 中对对象进行二进制序列化时,您最终会得到一个字节数组,这对人类来说显然毫无意义。
这个字节数组是否对应于人类可读的更有意义的字符串表示?或者您是否需要完全反序列化它以使其更具人类可读性?
我希望二进制格式化程序在发出字节数组之前具有它使用的对象的一些中间字符串表示形式。这对我的需求来说是完美的......
我尝试使用 Base64 对字节数组进行编码,但结果却是乱码。
编辑:
正如我在回答中所解释的,UTF8 编码是你能得到的最好的。
我想这样做的原因是我可以区分两个二进制序列化并只存储第一个序列化和差异,并且有兴趣了解序列化是如何工作的,以便找出如何最好地区分字节数组。
解决方案
如何分析二进制序列化流的内容?更详细地讨论了二进制序列化的格式,并且还提供了到各种分析器的链接。
没有完全人类可读的中间表示,但 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"
这不是完全没用...
推荐阅读
- c++ - 程序没有正确读取字符串
- python - 无法将值转换为 int python
- asp.net - ASP.net Webform 中的 Page_OnLoad 事件中的会话 ID 为空
- google-cloud-run - Cloud Run - 使用通配符子域的自定义域映射
- google-cloud-platform - 调整 GKE 以加快分配和分配 IP 给新服务的速度
- php - MapBox addLayer/addSource 不添加从 php 创建的 geoJson 的点
- sql-server - 在 SQL 中粉碎 XML 但交叉应用会添加不需要的记录
- c# - 发送电子邮件始终返回 5.7.3 身份验证不成功代码或身份验证失败的某些变体
- twilio - 通过 SMS 自动化发送唯一代码
- android - android studio 应用程序文件夹丢失。如何再次显示?