C# 控制字符的序列化

C# 控制字符的序列化,c#,unicode,xml-serialization,ascii,C#,Unicode,Xml Serialization,Ascii,在我的程序中,我希望保存用户可能拥有的对象列表。每个对象都有一个特定的值,很像ID或引用。我认为将对象的数值转换为ASCII字符以保存到磁盘是一个好主意 这是我的对象数组: public short[,] Data = new short[5,5]; 我用随机数(42到100之间,代表用户可能拥有的对象ID)填充数据,然后将数据转换为ASCII字符,然后将其序列化为文件: for (int i = 0; i <= 4; i++) { for (int ii = 0; ii <

在我的程序中,我希望保存用户可能拥有的对象列表。每个对象都有一个特定的值,很像ID或引用。我认为将对象的数值转换为ASCII字符以保存到磁盘是一个好主意

这是我的对象数组:

public short[,] Data = new short[5,5];
我用随机数(42到100之间,代表用户可能拥有的对象ID)填充数据,然后将数据转换为ASCII字符,然后将其序列化为文件:

for (int i = 0; i <= 4; i++)
{
    for (int ii = 0; ii <= 4; ii++)
    {
        Data[i, ii] = (short)Rand.Next(42, 100); //random numbers to get random characters
        Save_Data.ASCII += (char)Data[i, ii]; //Converting to ASCII and adding to Class which will be saved to file
    }
}

XmlSerializer Writer = new XmlSerializer(typeof(Save_Data)); 

using (FileStream file = File.OpenWrite(myfile)) 
{
    Writer.Serialize(file, Save_Data);
}
这个很好用但是,如果我扩展随机函数的范围,即:

Rand.Next(12,100);
要包含其他ASCII字符(如控制字符),在将文件读取到程序时会出现错误:

XML文档(x,y)中存在错误

(x=行,Y=列)

它后来指出例外情况是:

V”,十六进制值W,是无效字符。行X,位置 Y.

V=ASCII控制字符

W=此控制字符的十六进制值

X=行号

Y=位置值

控制字符是否不可转换?如果是这样的话,有办法解决吗


第二点注意:此方法没有控制字符,只会给我提供,正如所述,大多数ASCII控制字符在原始数据嵌入XML文档时无效。使用
和#DECIMAL对其进行转义的实体
&#xHEX
是包含这些字符的首选方式。

如前所述,大多数ASCII控制字符在原始数据嵌入XML文档时无效。使用
和#DECIMAL对其进行转义的实体
&#xHEX
是包含这些字符的首选方式。

问题在于您将二进制数据嵌入到文本文档中。在二进制序列化中完成全部操作,或者通过
.ToString()
方法将数字转换为字符串

如果将对象数组更改为一维数组,则只需将
字符串Save_Data.ASCII
替换为
short[]Save_Data.Data
,而
XmlSerializer
将直接序列化,无需手动将任何内容转换为字符串。这是最容易做到的事


WRT unicode,这将与原始版本有相同的问题,它仍然是嵌入到文本中的二进制文件。因此,如果您的一个字符是例如
”,那么问题在于您正在将二进制数据嵌入到文本文档中。在二进制序列化中完成全部操作,或者通过
.ToString()
方法将数字转换为字符串

如果将对象数组更改为一维数组,则只需将
字符串Save_Data.ASCII
替换为
short[]Save_Data.Data
,而
XmlSerializer
将直接序列化,无需手动将任何内容转换为字符串。这是最容易做到的事


WRT unicode,这将与原始版本有相同的问题,它仍然是嵌入到文本中的二进制文件。因此,如果您的一个字符是例如
”,另一种方法是创建一个字节数组,大小与短数组的维度相同,并用(字节)数据[i,ii]填充它

然后使用Convert.ToBase64String(byte_数组),您将拥有一个可以安全地在XML文档中使用的字符串


对于反序列化,使用Covert.FromBase64String(xml_值)返回字节数组,并循环填充短数组。

另一种方法是根据短数组的维度创建一个字节数组,并用(字节)数据[i,ii]填充它

然后使用Convert.ToBase64String(byte_数组),您将拥有一个可以安全地在XML文档中使用的字符串


对于反序列化,请使用Covert.FromBase64String(xml_值)返回字节数组,并循环填充短数组。

您是否尝试直接序列化数组


我认为没有太多的理由让您尝试执行XML序列化程序的工作。最糟糕的情况是将5x5数组展平为25个元素的一维数组

您是否尝试直接序列化数组


我认为没有太多的理由让您尝试执行XML序列化程序的工作。最糟糕的情况是将5x5数组展平为25个元素的一维数组

迈克尔的回答是正确的。我还强烈建议您进一步了解XML的基本原理,特别是如何更好地使用它。这不仅仅是一个文本转储:标记应该是自描述数据的,因此人类有机会“读取”XML文件的含义。以这种方式转储对象数组根本不是自描述的。michaelb958的回答是正确的。我还强烈建议您进一步了解XML的基本原理,特别是如何更好地使用它。它不仅仅是一个文本转储:标记应该是自描述数据的,因此人类有机会“读取”XML文件的含义。以这种方式转储对象数组根本不是自描述的。如何将字符转换为字节?一个字符是16位,一个字节只有8?对,但是使用中的字符(因为你这么说)总是在ascii范围内,换句话说就是在字节值范围内。哦,好的。我只是使用了你建议的将它们转换为char的示例,但这不起作用。无论如何,谢谢你。我的错。我将(字符)数据[I,ii]更改为(字节)数据[I,ii]。它应该会起作用。很抱歉,谢谢你。这正是我想要的。认为它实际上是Convert.FromBase64String(xml\u值)
,但不管怎样,谢谢!如何将字符转换为字节?一个字符是16位,一个字节只有8?对,但是使用中的字符(因为你这么说)总是在ascii范围内,换句话说就是在字节值范围内。哦,好的。我只是在使用你建议的将它们转换为char的示例
Rand.Next(12,100);