简体   繁体   中英

string serialization and deserialization problem

I'm trying to serialize/deserialize string. Using the code:


       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)); }

This two code works fine if I play with string variables.

But If I deserialize a string and save it to a file, after reading the back and serializing it again, I end up with only first portion of the string. So I believe I have a problem with my file save/read operation. Here is the code for my save/read


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; }

Any help will be appreciated. Many thanks

Sample Problematic Run:


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"

Just use

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

and don't forget to add System.Text in your using statements

BTW, why do you need to serialize a string and save it that way? You can just use File.WriteAllText() or File.WriteAllBytes. The same way you can read it back, File.ReadAllBytes() and File.ReadAllText()

The problem is that you are writing two strings to the file, but only reading one back.

If you want to read back multiple strings, then you must deserialize multiple strings. If there are always two strings, then you can just deserialize two strings. If you want to store any number of strings, then you must first store how many strings there are, so that you can control the deserialization process.

If you are trying to hide data (as indicated by your comment to another answer), then this is not a reliable way to accomplish that goal. On the other hand, if you are storing data an a user's hard-drive, and the user is running your program on their local machine, then there is no way to hide the data from them, so this is as good as anything else.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM