【问题标题】:Serialize .NET Array to XML as base 64?将 .NET 数组序列化为 XML 作为 base 64?
【发布时间】:2023-03-08 13:48:02
【问题描述】:

我正在用 C# 编写一个自定义 .NET 序列化程序,并希望使用 XmlReader 和 XmlWriter 将 Array 对象读取和写入 XML。我想对数组进行base64编码。数组可以是 1 维、2 维或 3 维,元素是 bool 或 numeric 类型。

我完全被难住了。 XmlReader 和 XmlWriter 具有以 base64 格式读取/写入 Byte[] 数组的方法,但我不知道如何从 Array 到 Byte[] 并返回。

数组可能很大,所以我更喜欢不涉及复制数组或一次处理一个元素的解决方案。不安全的代码和托管或本机 C++ 都可以。如果对 XML 是安全的,我可以使用 base64 以外的东西。

感谢任何帮助或提示。

【问题讨论】:

    标签: .net arrays serialization base64


    【解决方案1】:

    您将有不同的选择,具体取决于您使用的“阵列”类型。是 Array、List 还是 ArrayList?

    对于 List,您可以使用 CopyTo() 获取您的 List 的一部分并将它们放入二进制数组中,然后您可以使用 XmlWriter 编写该数组。要从 XmlReader 中读回它们,您可以简单地使用 InsertRange 对数据进行反序列化。

    阅读示例:

    // elsewhere
    List<byte> bytes;
    
    // in the deserialization
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize]; 
    int index = 0;
    int numRead = -1;
    
    while (numRead != 0) // actually read stuff
    {
        numRead = reader.ReadContentAsBase64(buffer,  bufferSize);
        if (numRead > 0)
        {
            bytes.CopyTo(buffer, index, numRead);
            index += numRead;
        }
    }
    

    注意:上面的代码未经测试,但可能接近。您可以执行类似但相反的操作,将数据编码和写入 base64。对于其他类型,您只需将数组转换为字节列表即可。

    要将字节以外的其他类型放入字节数组中,您需要使用System.BitConverter。这有两种方法会让你很开心:GetBytes 将任何基本数据类型转换为字节数组,ToXxx 包括ToInt32ToBoolean。在您读入 base64 信息之后或写出之前,您将负责自己进行转换。

    您可以使用 BitConverter 将每位转换为一组字节,但您需要设计一种算法来将您的数组转换为单字节数组并返回。

    【讨论】:

    • 是一个System.Array,比如byte[]或者int[,]。 “二进制数组”是什么意思?我将如何用 XmlWriter 编写它?
    • 啊,'数字或布尔类型'。然后,您需要在写出之前将其转换为基于字节的数组。
    • XmlReader和XmlWriter直接支持读写byte[],所以没有问题。如果源是 int[] 或 byte[,](二维数组)怎么办?
    • 另外,考虑使用 .NET 的内置 Xml 序列化:stackoverflow.com/questions/496488/… 会为您省去很多麻烦。 :)
    【解决方案2】:

    如果您需要由包含 Base-64 文本的单个 XML 元素表示的单个数组,最简单的方法可能是使用 BinaryFormatter 将您的数据(任意维数的数组、列表等)转换为一个字节数组,然后简单地进行 base-64 编码并将其粘贴到您的 XML 文件中。我想不出任何其他将任意数组转换为字节数组的简单方法。

    【讨论】:

    • 是的,我认为这可能是最好的解决方案。不幸的是,它需要将数组复制到我希望避免的 BinaryFormatter 输出。
    【解决方案3】:

    简要总结一下我最终做了什么: 对于序列化,我使用 BinaryWriter 将单个元素写入到 MemoryStream 中包装的字节数组中。我将写入分成小块,因此 MemoryStream 数组保持较小。将块编写为具有 base64 编码文本内容的单个 XML 元素。

    反序列化几乎是相反的; base64 块被解码为字节数组;字节数组由内存流包装并由 BinaryReader 读取以将元素推送到结果数组中。

    【讨论】:

      【解决方案4】:

      如果您使用 XmlSerializer,您可以在 byte[] 类型的属性中指定 XmlElementAttribute,并将 DataType 属性设置为“base64Binary”。见here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多