4

我在 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;

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

4

3 回答 3

7

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

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

于 2009-12-24T11:37:48.570 回答
2

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

byte[] toEncodeAsBytes = System.Text.Encoding.UTF8.GetBytes(toEncode);
于 2009-12-24T11:40:52.440 回答
0

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

XmlWriter被大多数 xml 代码所接受。

于 2009-12-24T11:44:27.360 回答