[英]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.