我在运行时有一个对象集合,它已经是可序列化的,我需要将对象的状态持久化到一个文件中。我做了一个快速编码使用BinaryFormatter和保存序列化对象到一个文件。
我想我可以每行保存一个对象。但当我在记事本中打开文件时,它比一行还长。它没有滚动。我如何存储一个二进制序列化对象每行?
我知道我可以在每个对象之后使用分隔符,这样当将它们读回应用程序时,我可以知道对象的结束。根据信息论,这增加了数据的大小(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序列化更强调可读性,所以很多速度较慢,很可能不那么紧凑。
你可以单独序列化每个对象,并在每个对象之间发出一些分隔符(例如换行符),但我不知道你可以使用什么分隔符来保证不出现在序列化的数据中(如果你序列化一个包含换行符的字符串会发生什么?)
如果你使用。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());