c # двоичная сериализация в файл строка за строкой или как отделить - PullRequest
3 голосов
/ 28 апреля 2011

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

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

Я знаю, что могу использовать разделитель после каждого объекта, поэтому, читая их обратно в приложение, я могу знать конец объекта.Ну, согласно теории информации, это увеличивает размер данных (книга Sipser).

Каков наилучший алгоритм для создания разделителя, который бы не нарушал информацию?

Вместо двоичной сериализации?Как вы думаете, формат JSon более осуществим?Могу ли я хранить сущность в формате json, строка за строкой?

Кроме того, сериализация / десериализация приводит к дополнительным расходам, снижает производительность.Будет ли Джсон быстрее?

идей?

Спасибо.

Спасибо.

Ответы [ 4 ]

6 голосов
/ 28 апреля 2011

Функции сериализации, такие как очередь FIFO, вам не нужно читать части файла, потому что форматировщик делает это за вас, вам просто нужно знать порядок, в который вы помещали объекты внутрь.

public class Test
    {

        public void testSerialize()
        {
            TestObj obj = new TestObj();
            obj.str = "Some String";
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, obj);
            formatter.Serialize(stream, 1);
            formatter.Serialize(stream, DateTime.Now);
            stream.Close();
        }

        public void TestDeserialize()
        {
            Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.None);
            IFormatter formatter = new BinaryFormatter();
            TestObj obj = (TestObj)formatter.Deserialize(stream);
            int obj2 = (int)formatter.Deserialize(stream);
            DateTime dt = (DateTime)formatter.Deserialize(stream);
            stream.Close();
        }
    }

    [Serializable]
    class TestObj
    {
        public string str = "1";
        int i = 2;
    }
1 голос
/ 28 апреля 2011

Двоичная сериализация сохраняет данные в произвольных байтах;эти байты могут включать символы новой строки.

Вы просите использовать новые строки в качестве разделителей.Новые строки ничем не отличаются от других разделителей;они также увеличат размер данных.

1 голос
/ 28 апреля 2011

Ну,

Сериализация / десериализация привносит накладные расходы, будет ли Json быстрее?

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

Если вы используете разделитель, который испускает среда сериализации .Net, то, очевидно, вам будет трудно (если не невозможно) правильно определить, где разрывы между объектами приводят к сбоям десериализации.

Почемуименно вы хотите поставить каждый объектт на своей собственной линии?

0 голосов
/ 30 апреля 2011

Вы также можете создать ArrayList, добавить к нему объекты и затем сериализовать его;)

ArrayList list = new ArrayList();
list.Add(1);
list.Add("Hello World");
list.Add(DateTime.Now);

BinaryFormatter bf = new BinaryFormatter();

FileStream fsout = new FileStream("file.dat", FileMode.Create);
bf.Serialize(fsout, list);
fsout.Close();

FileStream fsin = new FileStream("file.dat", FileMode.Open);
ArrayList list2 = (ArrayList)bf.Deserialize(fsin);

fsin.Close();

foreach (object o in list2)
   Console.WriteLine(o.GetType());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...