C#如何序列化二进制增量数据
我正在开发一款采集软件(C#),采集到的数据必须在到达时存储在硬盘上(分块存储是可以接受的,而且更可取) 我选择了一个大致具有以下结构的可序列化对象:C#如何序列化二进制增量数据,c#,serialization,binary,C#,Serialization,Binary,我正在开发一款采集软件(C#),采集到的数据必须在到达时存储在硬盘上(分块存储是可以接受的,而且更可取) 我选择了一个大致具有以下结构的可序列化对象: [Serializable] public class MyData { public string LocationId; public DateTime TimeStamp; public List<float[]> MyData; } 它可以工作,但是一旦采集完成,序列化就会发生,在采集完成之前,完
[Serializable]
public class MyData
{
public string LocationId;
public DateTime TimeStamp;
public List<float[]> MyData;
}
它可以工作,但是一旦采集完成,序列化就会发生,在采集完成之前,完整的数据将以MyData
的形式驻留在内存中
我想要实现的是:
- 当我开始采集时,只有“固定”字段(即
和LocationId
)被写入文件TimeStamp
- 一旦
达到计数,比如100,它就会被追加到文件中MyData
- 将数据附加到文件后,
将被清除MyData
- 每次添加另一个(比如100个)列表项时,它们都会附加到文件中,并且
会被清除MyData
- 当数据被获取时,反序列化永远不会发生,因此,在数据增长时处理数据不是一个问题(通常在一个单独的、功能强大的硬件上进行)
- 我希望结果文件是二进制的,而不是JSON、XML或YAML,因为需要获取大量数据,我不希望文件膨胀
- 我希望定期追加文件,因为我不想将所有追加的数据都保存在内存中(同样,数据量),如果出现问题,我可以接受最后一个块丢失,但不是所有数据
- 我想定期将数据转储到文件中,因为硬盘容量通常(至少在我们计划使用的硬件中)比可用RAM(存储
的地方)大得多MyData
- 以YAML或JSON的形式存储“固定”字段
- 在某个标记之后追加二进制数据
- 首先将文件的顺序保持为“固定”字段,数据始终位于末尾
如果没有,我自己的序列化方法是完整的还是遗漏了一些方面?“如果我使用二进制格式化程序”-不,不要。请不要:“BinaryFormatter不安全,无法使其安全。有关详细信息,请参阅BinaryFormatter安全指南。”我知道这一点。因此我的问题是,这样一个文件的预期大小是多少?至于时间戳:你喜欢本地化吗?您可以考虑DATEMETROBACK……我想,实际上我会创建两个文件:一个“头”文件和一个“数据”文件。在头文件中输入timestamp和locationId(不管您喜欢什么,XML、Yaml、JSON…)。并且数据文件可以附加到与第一个数据文件无关的数据文件。稍后,我可能会将它们压缩,创建自己的“容器文件格式”谢谢,我知道我现在的发展方向。
public void Serialize(string filename)
{
FileStream fs = new FileStream(filename, FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
try
{
formatter.Serialize(fs, this);
}
catch (SerializationException)
{
throw;
}
finally
{
fs.Close();
}
}