У меня есть один файл, и мне нужно сериализовать несколько объектов случайным образом. Как я могу в C #? - PullRequest
6 голосов
/ 03 мая 2009

У меня есть один файл, и мне нужно сериализовать несколько объектов одного и того же класса, когда создается новый объект. Я не могу хранить их в массивах, так как мне нужно сериализовать их, когда создается экземпляр объекта. Пожалуйста, помогите мне.

Ответы [ 3 ]

7 голосов
/ 03 мая 2009

Какой механизм сериализации вы используете? XmlSerializer может быть проблемой из-за корневого узла и таких вещей, как объявления пространств имен, которые немного сложно найти - плюс это не очень хорошо при частичной десериализации. BinaryFormatter очень хрупкий для начала - я не рекомендую его в большинстве случаев.

Один из вариантов может быть protobuf-net ; это двоичный сериализатор (использующий формат «протокольных буферов» Google - эффективный, переносимый и совместимый с версией). Вы можете сериализовать несколько объектов в поток с помощью Serializer.SerializeWithLengthPrefix. Чтобы десериализовать те же самые элементы, Serializer.DeserializeItems возвращает IEnumerable<T> десериализованных элементов - или вы можете легко сделать TryDeserializeWithLengthPrefix общедоступным (в настоящее время он является закрытым, но источник доступен).

Просто запишите каждый объект в файл после того, как вы его создали - работа выполнена.

Если вам нужен пример, скажите - хотя модульные тесты здесь дают обзор.

В основном это будет что-то вроде (не проверено):

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 голосов
/ 04 мая 2009

Для каждого поступающего объекта мы конвертируем его в строку Base64Encoded и сохраняем как одну строку в текстовом файле. Итак, в этом файле каждая строка будет иметь сериализованный объект в каждой строке. При чтении мы будем читать файл по одной строке за раз и десериализовать эту строку в кодировке Base64 в наш объект. Легко ... так что давайте попробуем код.

http://www.codeproject.com/KB/cs/serializedeserialize.aspx?display=Print

0 голосов
/ 03 мая 2009

См. Ответ здесь .

Короче говоря, просто сериализуйте все в один и тот же файловый поток, а затем десериализуйте. dotNet будет знать размер каждого объекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...