I have a single file and need to serialize multiple objects of the same class when ever a new object is created. I can't store them in arrays as I need to serialize them the instance an object is create. Please, help me.
views:
802answers:
3See answer here.
In short, just serialize everything to the same file stream, and then deserialize. dotNet would know the size of each object
What serialization mechanism are you using? XmlSerializer
might be a problem because of the root node and things like namespace declarations, which are a bit tricky to get shot of - plus it isn't great at partial deserializations. BinaryFormatter
is very brittle to begin with - I don't recommend it in most cases.
One option might be protobuf-net; this is a binary serializer (using Google's "protocol buffers" format - efficient, portable, and version-tolerant). You can serialize multiple objects to a stream with Serializer.SerializeWithLengthPrefix
. To deserialize the same items, Serializer.DeserializeItems
returns an IEnumerable<T>
of the deserialized items - or you could easily make TryDeserializeWithLengthPrefix
public (it is currently private, but the source is available).
Just write each object to file after you have created it - job done.
If you want an example, please say - although the unit tests here give an overview.
It would basically be something like (untested):
using(Stream s = File.Create(path))
{
Serializer.SerializeWithLengthPrefix(s, command1, PrefixStyle.Base128, 0);
... your code etc
Serializer.SerializeWithLengthPrefix(s, commandN, PrefixStyle.Base128, 0);
}
...
using(Stream s = File.OpenRead(path)) {
foreach(Command command in
Serializer.DeserializeItems<Command>(s, PrefixStyle.Base128, 0))
{
... do something with command
}
}
For every object that arrives, we will convert it into a Base64Encoded string and store it as one line in a text file. So, in this file, every row will have a serialized object per line. While reading we will read the file one line at a time and deserialize this Base64 encoded string into our Object. Easy.. so lets try out the code.
http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print