【问题标题】:C# base64 encoding/decoding with serialization of objects issueC# base64 编码/解码与对象序列化问题
【发布时间】:2010-12-29 19:15:42
【问题描述】:

我在 C# 中为我的项目(这是一个类)使用序列化和反序列化。 它们被序列化并保存到 XML 文件中。加载项目时,一切顺利。

现在我正在尝试将序列化的项目编码为 Base64,然后保存文件,这也很顺利。文件的第一行(编码前!)如下所示:

<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

当我解码文件时,在行前添加了一个 ?

?<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

我用来编码的代码:

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
        string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
        return returnValue;

以及解码代码:

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);
        string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
        return returnValue;

这可能是什么,我该如何解决?

【问题讨论】:

    标签: c# serialization encoding base64 decoding


    【解决方案1】:

    不必担心编码,也许只需使用XmlWriter.Create(outPath),并将XmlWriter 传递给您的序列化代码。这将避免这个问题和其他问题(例如必须为大型对象图缓冲非常大的字符串)。有一个重载接受 XmlWriterSettings 以进行更精细的控制。

    XmlWriter 被大多数 xml 代码接受。

    【讨论】:

      【解决方案2】:

      该文件将自己声明为 UTF-8 - 那么为什么要使用 ASCII 将其编码为二进制呢? UTF-8 中有许多字符无法用 ASCII 表示。您甚至必须将文件以文本形式存储在内存中吗?为什么不直接将其作为二进制数据加载(例如File.ReadAllBytes)?

      如果您确实需要以字符串开头,请使用Encoding.UTF-8(或Encoding.Unicode,尽管这可能会导致更大的字节数组),一切都应该没问题。那个额外的字符是一个字节顺序标记 - 它不能用 ASCII 表示,因此是“?”替换字符。

      【讨论】:

        【解决方案3】:

        猜测?表示 Byte-Order-Marker,它是一个不能用 ASCII 表示的字符。为什么不使用 UTF-8 编码?

        byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 2011-08-03
          • 1970-01-01
          • 1970-01-01
          • 2012-01-12
          • 1970-01-01
          • 2017-08-13
          相关资源
          最近更新 更多