控制字符的序列化

本文关键字:序列化 控制字符 | 更新日期: 2023-09-27 18:11:57

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

这是我的对象数组:

public short[,] Data = new short[5,5];

我用随机数(42到100之间,表示用户可能拥有的对象id)填充它,然后将数据转换为ASCII字符,然后将其序列化到file:

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);
}

当读取文件时,我没有得到任何错误,并且可以将数据转换回值列表。虽然原始数据在数组中,但我没有包括将列表返回到数组中的代码

Save_Data fList; 
XmlSerializer Reader = new XmlSerializer(typeof(Save_Data)); 
using (FileStream input = File.OpenRead(myfile)) 
{
    fList = Reader.Deserialize(input) as Save_Data; //Reading in the data
}
string Final = "";
byte[] ASCII = Encoding.ASCII.GetBytes(fList.World);
foreach (Byte b in ASCII)
{
    Final += " " + b.ToString();
}
Console.WriteLine(Final);

这很好。然而,如果我扩展随机函数的范围,即:

Rand.Next(12,100);

包含其他ASCII字符,如控制字符,我得到一个错误,当读取文件到我的程序:

XML文档(x, y)中有错误。

(x = Row, Y = Col)

随后声明异常为:

"'V',十六进制值W是无效字符。Line X, position y "

V = ASCII控制字符

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

X =行号

Y =位置值

控制字符不可序列化吗?如果是这样,有没有办法解决这个问题?

第二个注意事项:这个方法,没有控制字符,只会给我60个可能的对象ID/引用号。我认为使用Unicode可能会更好,因为它可以支持更多的字符,给我一个更大的范围。我目前的代码是否有一种方法使用Unicode超过ASCII?如果这是一个非常基本的问题,我提前道歉,因为我对Stack相当陌生…

控制字符的序列化

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

另一种方法是创建一个与短数组大小相同的字节数组,并用(byte)Data[i, ii]填充它。

然后使用Convert.ToBase64String(byte_array),你将得到一个可以安全地在XML文档中使用的字符串。

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

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

如果您将对象数组更改为单维数组,那么您可以简单地将string Save_Data.ASCII替换为short[] Save_Data.Data, XmlSerializer将直接序列化,而无需手动将任何内容转换为字符串。在我看来,这是最简单的事情。

WRT unicode,这将有相同的问题,作为原始的,它仍然是二进制嵌入到文本。因此,如果您的字符之一是'<',例如,XML将认为它是一个新标签的开始,现在您的XML是无效的,unicode或否。我在第二段中的解决方案完全避免了这个问题,因为int在序列化之前被编码为十进制字符串。

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

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