AFgone
AFgone

Reputation: 1250

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"

Upvotes: 3

Views: 6927

Answers (2)

Jeffrey L Whitledge
Jeffrey L Whitledge

Reputation: 59473

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.

Upvotes: 0

Davita
Davita

Reputation: 9124

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()

Upvotes: 5

Related Questions