【问题标题】:Why do byte arrays turn to gibberish when serialized?为什么字节数组在序列化时会变成乱码?
【发布时间】:2017-11-16 18:07:11
【问题描述】:

通过这样的调用传递的数据的原始结构会发生什么变化:

 MyImg bytes = new MyImg
            {
                Id = 1,
                Img = new byte[] { 1, 0, 5 },
                Text = "hiiiiiii"
            };

        IFormatter formatter2 = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream())
        {
            formatter2.Serialize(stream, bytes);
            bytes.Img = stream.ToArray();
        }

它的产生方式有很多抽象:

{ “ID”:1, “IMG”: “AAEAAAD ///// AQAAAAAAAAAMAgAAAEpNZXNzYWdlQm9hcmRCYWNrZW5kLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJU1lc3NhZ2VCb2FyZEJhY2tlbmQuQ29udHJvbGxlcnMuTXlJbWcDAAAAEzxJZD5rX19CYWNraW5nRmllbGQUPEltZz5rX19CYWNraW5nRmllbGQVPFRleHQ + a19fQmFja2luZ0ZpZWxkAAcBCAICAAAAAQAAAAkDAAAABgQAAAAIaGlpaWlpaWkPAwAAAAMAAAACAQAFCw ==”, “文本”: “hiiiiiii”} P>

我只是想了解发生了什么。

串行/反序列化是一个通用过程还是 .Net 做的事情与 Java 不同?

【问题讨论】:

  • 序列化为字符串,使用Base64编码。
  • 序列化仅意味着“将对象的内存表示转换为字符串”。做事没有单一的标准。 .Net 本身就提供了多种实现方式,BinaryFormatter 只是其中之一。
  • ����ÿÿÿÿ������� ���JMessageBoardBackend, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null���%MessageBoardBackend.Controllers.MyImg���<Id>k__BackingField<Img>k__BackingField<Text>k__BackingField������� ������hiiiiiii������� 有趣的内容,那里。
  • .Net Core 是开源的,因此您可以从技术上查看每一行代码,看看它是如何发生的。 .Net 的其他版本不是,因此您需要使用反射来了解发生了什么。
  • 这里是BinaryFormatter的源代码

标签: .net arrays json bytestream


【解决方案1】:

您的字节数组在 JSON 中编码为 Base64 字符串,这是确保序列化字节不包含序列化程序本身不可打印或使用的字符的常用方法(例如 < 或 @ XML 格式的 987654323@,JSON 格式的 {} 等)

【讨论】:

  • 谢谢你。我将添加验证以排除这些。
  • @fasecity 您可能不想推出自己的序列化。与软件工程中的大多数情况一样,重新发明轮子是最后的选择。
  • 不,根本不是这样。问题是我想了解它是如何工作的,因为我只是厌倦了像它的魔力一样看待代码,只是将它插入我的代码库而不理解它。我喜欢抽象,但这可能是人类历史上最好的发现之一,我只是想看看他们是如何做到的。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2012-06-18
  • 1970-01-01
  • 2012-09-02
  • 2023-03-04
相关资源
最近更新 更多