首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制字符的序列化

控制字符的序列化
EN

Stack Overflow用户
提问于 2013-05-01 22:06:09
回答 4查看 2K关注 0票数 0

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

下面是我的对象数组:

代码语言:javascript
运行
复制
public short[,] Data = new short[5,5];

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

代码语言:javascript
运行
复制
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);
}

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

代码语言:javascript
运行
复制
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);

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

代码语言:javascript
运行
复制
Rand.Next(12,100);

若要包含其他ASCII字符(如控制字符),在将文件读取到我的程序时会出现错误:

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

(x = Row,Y= Col)

它后来指出,例外情况是:

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

V= ASCII控制字符

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

X=行号

Y=位置值

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-02 02:21:22

另一种方法是在短数组的尺寸上创建一个字节数组,并将其填充(字节)Datai,ii。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-05-01 22:18:47

正如概述的这里一样,当将原始数据嵌入到XML文档中时,大多数ASCII控件字符都是无效的。实体-使用&#DECIMAL;&#xHEX;对它们进行转义是包含这些字符的首选方法。

票数 2
EN

Stack Overflow用户

发布于 2013-05-01 22:33:06

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

如果您将对象数组更改为一维数组,那么您可以简单地用一个string Save_Data.ASCII替换您的short[] Save_Data.DataXmlSerializer将直接序列化它,而不需要手动将任何内容转换为字符串。这是最容易做的事,海事组织。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16327274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档