在我的程序中,我希望保存用户可能拥有的对象列表。每个对象都有一个特定的值,很像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);
}
读取文件时,我没有错误,可以将数据转换回值列表。 虽然原始数据在数组中但我没有包含代码以将列表返回到数组中
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 ,是无效字符。行 X ,位置 的ý。“
V = ASCII控制字符
W =此控制字符的十六进制值
X =行号
Y =位置值
控制字符是否不可序列化?如果是这样,有没有办法绕过这个?
在第二个注释中:此方法没有控制字符,只能为我提供<60个可能的对象ID /参考号。我认为或许使用Unicode会更好,因为这可以支持更多的字符,从而为我提供更大的范围。使用我当前的代码是否有一种使用Unicode而不是ASCII的方法?如果这是一个非常基本的问题我会事先道歉,因为我对Stack很新...
答案 0 :(得分:2)
如概述here所述,当将原始数据嵌入到XML文档中时,大多数ASCII控制字符都无效。使用&#DECIMAL;
或&#xHEX;
转义实体的实体是包含这些字符的首选方式。
答案 1 :(得分:1)
另一种方法是创建一个在短数组维度上调整大小的字节数组,并用(byte)Data [i,ii]填充它。
然后使用Convert.ToBase64String(byte_array),你将拥有一个可以安全地在XML文档中使用的字符串。
对于反序列化,使用Covert.FromBase64String(xml_value)返回字节数组,并循环填充短数组。
答案 2 :(得分:0)
问题在于您将二进制数据嵌入到文本文档中。要么完成二进制序列化,要么通过.ToString()
方法将数字转换为字符串。
如果您将对象数组更改为一维数组,那么您只需将string Save_Data.ASCII
替换为short[] Save_Data.Data
,而XmlSerializer
将直接将其序列化,而无需您手动将任何东西转换为字符串。这是做IMO最简单的事情。
WRT unicode,它将与原版具有相同的问题,它仍然是嵌入到文本中的二进制文件。因此,如果你的一个字符是'<'
,那么XML会认为它是新标记的开头,现在你的XML是无效的,unicode与否。我的第二段中的解决方案完全避免了这个问题,因为在序列化之前,int被编码为十进制字符串。
答案 3 :(得分:0)
您是否尝试过直接序列化数组?
我认为您没有太多理由尝试为它进行XML Serializer的工作。你应该做的最糟糕的事情是将你的5x5阵列压扁成25个元素的一维数组。