Непрерывная сериализация коллекции сложных объектов в файл - PullRequest
1 голос
/ 15 февраля 2012

Я работаю над приложением, которое записывает состояние сложной системы. Я должен записать эти состояния в файлы XML (используя сериализацию XML). Этот файл используется для воспроизведения записанного события и его анализа.

контекст:

Мое приложение отображает набор сложных данных (мы назвали это VIEW) каждое представление содержит 1 объект и 2 набора объектов (по 400 элементов в каждом с около 20 свойствами).

Приложение записывает состояние данных с фиксированным интервалом (время между двумя записями может варьироваться от 5 секунд до 60 минут), все записи хранятся в коллекции VIEWS, и мы сохраняем эту коллекцию VIEW в файле трассировки ( используя xmlserializer и сериализовать мою коллекцию объектов в средство записи текста)

Все работает хорошо, но когда файл достигает около 20 Мо, сохранение файла может занять больше времени, чем время между событием 2 записи (файл хранится в сети и иногда у нас возникают задержки), и мы хотим оптимизировать это.

Итак, мой вопрос:

Есть ли способ добавить объект в файл без необходимости загрузки и записи всего файла или способ оптимизации сериализации в файл?

Мы должны использовать сериализацию xml, поскольку файл должен быть доступен для чтения человеком и по коду (десериализация).

1 Ответ

0 голосов
/ 15 февраля 2012

Как насчет использования базы данных?Эти вещи предназначены для решения подобных проблем :) Если вы хотите сделать это вручную, вам придется объявить свой собственный протокол.Примитивная рабочая реализация:

[Serializable]
public class Test
{
    public string Name { get; set; }
}

private static string Serialize(Test instance)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Test));
    using (MemoryStream stream = new MemoryStream())
    {
        serializer.Serialize(stream, instance);
        return Convert.ToBase64String(stream.ToArray());
    }
}
private static Test Deserialize(string instance)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Test));
    byte[] instanceBytes = Convert.FromBase64String(instance);

    using (MemoryStream stream = new MemoryStream(instanceBytes))
    {
        return serializer.Deserialize(stream) as Test;
    }
}



public static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    {
        // write some test objects
        StreamWriter writer = new StreamWriter(stream);
        writer.WriteLine(Serialize(new Test() { Name = "test1" }));
        writer.WriteLine(Serialize(new Test() { Name = "test2" }));
        writer.WriteLine(Serialize(new Test() { Name = "test3" }));
        writer.Flush();

        // reset
        stream.Position = 0;

        // read them back again
        StreamReader reader = new StreamReader(stream);
        Test test1 = Deserialize(reader.ReadLine());
        Test test2 = Deserialize(reader.ReadLine());
        Test test3 = Deserialize(reader.ReadLine());
    }
}
...