繁体   English   中英

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

[英]c# binary serialization to file line by line or how to seperate

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

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

我知道我可以在每个 object 之后使用分隔符,因此在将它们读回应用程序时,我可以知道 object 的结尾。 好吧,根据信息论,这会增加数据的大小(Sipser book)。

提出不会破坏信息的分隔符的最佳算法是什么?

而不是二进制序列化? 你觉得JSon格式更可行吗? 我可以将实体逐行存储为 json 格式吗?

此外,序列化/反序列化会引入开销,影响性能。 Json 会更快吗?

想法?

谢谢。

谢谢。

序列化功能类似于 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 序列化更加强调可读性,因此很可能会更慢不那么紧凑。

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

如果您使用 .Net 序列化框架发出的分隔符,那么显然您将很难(如果不是不可能的话)正确确定对象之间的中断导致反序列化失败的位置。

为什么您要将每个 object 放在自己的行上?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM