控制字符的序列化

时间:2013-05-01 22:06:10

标签: 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 <= 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很新...

4 个答案:

答案 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个元素的一维数组。