字符串序列化和反序列化问题

时间:2011-03-02 20:28:37

标签: c# serialization

我正在尝试序列化/反序列化字符串。使用代码:


       private byte[] StrToBytes(string str)
       {
            BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream(); bf.Serialize(ms, str); ms.Seek(0, 0); return ms.ToArray(); } private string BytesToStr(byte[] bytes) { BinaryFormatter bfx = new BinaryFormatter(); MemoryStream msx = new MemoryStream(); msx.Write(bytes, 0, bytes.Length); msx.Seek(0, 0); return Convert.ToString(bfx.Deserialize(msx)); }

如果我使用字符串变量,这两个代码可以正常工作。

但是如果我反序列化一个字符串并将其保存到文件中,在读完后面并再次序列化之后,我最终只得到字符串的第一部分。 所以我相信我的文件保存/读取操作有问题。这是我保存/阅读的代码


private byte[] ReadWhole(string fileName)
        {
            try
            {
                using (BinaryReader br = new BinaryReader(new FileStream(fileName, FileMode.Open)))
                {
                   return br.ReadBytes((int)br.BaseStream.Length);
                }
} catch (Exception) { return null; }
} private void WriteWhole(byte[] wrt,string fileName,bool append) { FileMode fm = FileMode.OpenOrCreate; if (append) fm = FileMode.Append; using (BinaryWriter bw = new BinaryWriter(new FileStream(fileName, fm))) { bw.Write(wrt); } return; }

任何帮助将不胜感激。 非常感谢

示例问题运行:


WriteWhole(StrToBytes("First portion of text"),"filename",true);
WriteWhole(StrToBytes("Second portion of text"),"filename",true);
byte[] readBytes = ReadWhole("filename");
string deserializedStr = BytesToStr(readBytes); // here deserializeddStr becomes "First portion of text"

2 个答案:

答案 0 :(得分:4)

只需使用

Encoding.UTF8.GetBytes(string s) 
Encoding.UTF8.GetString(byte[] b)

并且不要忘记在using语句中添加System.Text

顺便说一句,为什么你需要序列化字符串并以这种方式保存? 您可以使用File.WriteAllText()或File.WriteAllBytes。以同样的方式读回来,File.ReadAllBytes()和File.ReadAllText()

答案 1 :(得分:0)

问题是你在文件中写了两个字符串,但只读了一个字符串。

如果要读回多个字符串,则必须反序列化多个字符串。如果总有两个字符串,那么您可以反序列化两个字符串。如果要存储任意数量的字符串,则必须先存储有多少字符串,以便控制反序列化过程。

如果您试图隐藏数据(如您对其他答案的评论所示),那么这不是实现该目标的可靠方法。另一方面,如果您将数据存储在用户的硬盘驱动器中,并且用户正在本地计算机上运行程序,则无法隐藏数据,因此这与其他任何内容一样好。