I have a Single File And need to serialize multiple objects randomly. How can I in c#?

后端 未结 3 1740
被撕碎了的回忆
被撕碎了的回忆 2021-01-12 21:53

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 th

相关标签:
3条回答
  • 2021-01-12 22:33

    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

    0 讨论(0)
  • 2021-01-12 22:36

    See answer here.

    In short, just serialize everything to the same file stream, and then deserialize. dotNet would know the size of each object

    0 讨论(0)
  • 2021-01-12 22:38

    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
        }
    }
    
    0 讨论(0)
提交回复
热议问题