c#二进制序列化到文件的逐行或如何分隔

本文关键字:何分隔 分隔 逐行 序列化 二进制 文件 | 更新日期: 2023-09-27 17:53:39

我在运行时有一个对象集合,它已经是可序列化的,我需要将对象的状态持久化到一个文件中。我做了一个快速编码使用BinaryFormatter和保存序列化对象到一个文件。

我想我可以每行保存一个对象。但当我在记事本中打开文件时,它比一行还长。它没有滚动。我如何存储一个二进制序列化对象每行?

我知道我可以在每个对象之后使用分隔符,这样当将它们读回应用程序时,我可以知道对象的结束。根据信息论,这增加了数据的大小(Sipser book)。

什么是最好的算法来想出一个分隔符,不会破坏信息?

代替二进制序列化?你认为JSon格式更可行吗?我能以json格式逐行存储实体吗?

而且,序列化/反序列化会带来开销,影响性能。Json会更快吗?

想法?

谢谢。

谢谢。

c#二进制序列化到文件的逐行或如何分隔

序列化函数就像一个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;
    }

嗯,

序列化/反序列化会带来开销,Json会更快吗?

JSON仍然是序列化的一种形式,不,它可能不会比二进制序列化更快——二进制序列化的目的是紧凑和快速,而JSON序列化更强调可读性,所以很多速度较慢,很可能不那么紧凑。

你可以单独序列化每个对象,并在每个对象之间发出一些分隔符(例如换行符),但我不知道你可以使用什么分隔符来保证不出现在序列化的数据中(如果你序列化一个包含换行符的字符串会发生什么?)

如果你使用。net序列化框架发出的分隔符,那么很明显,你将使正确确定对象之间的中断导致反序列化失败变得困难(如果不是不可能的话)。

为什么你要把每个对象放在自己的行上?

二进制序列化将数据保存为任意字节;这些字节可以包括换行符。

您要求使用换行符作为分隔符。换行符与其他分隔符没有什么不同;它们还会增加数据的大小。

你也可以创建一个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());