控制字符的序列化
本文关键字:序列化 控制字符 | 更新日期: 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个元素的一维数组。