C#如何序列化二进制增量数据

C#如何序列化二进制增量数据,c#,serialization,binary,C#,Serialization,Binary,我正在开发一款采集软件(C#),采集到的数据必须在到达时存储在硬盘上(分块存储是可以接受的,而且更可取) 我选择了一个大致具有以下结构的可序列化对象: [Serializable] public class MyData { public string LocationId; public DateTime TimeStamp; public List<float[]> MyData; } 它可以工作,但是一旦采集完成,序列化就会发生,在采集完成之前,完

我正在开发一款采集软件(C#),采集到的数据必须在到达时存储在硬盘上(分块存储是可以接受的,而且更可取)

我选择了一个大致具有以下结构的可序列化对象:

[Serializable]
public class MyData
{
    public string LocationId;

    public DateTime TimeStamp;

    public List<float[]> MyData;
}
它可以工作,但是一旦采集完成,序列化就会发生,在采集完成之前,完整的数据将以
MyData
的形式驻留在内存中

我想要实现的是:

  • 当我开始采集时,只有“固定”字段(即
    LocationId
    TimeStamp
    )被写入文件
  • 一旦
    MyData
    达到计数,比如100,它就会被追加到文件中
  • 将数据附加到文件后,
    MyData
    将被清除
  • 每次添加另一个(比如100个)列表项时,它们都会附加到文件中,并且
    MyData
    会被清除
  • 当数据被获取时,反序列化永远不会发生,因此,在数据增长时处理数据不是一个问题(通常在一个单独的、功能强大的硬件上进行)
为什么:

  • 我希望结果文件是二进制的,而不是JSON、XML或YAML,因为需要获取大量数据,我不希望文件膨胀
  • 我希望定期追加文件,因为我不想将所有追加的数据都保存在内存中(同样,数据量),如果出现问题,我可以接受最后一个块丢失,但不是所有数据
  • 我想定期将数据转储到文件中,因为硬盘容量通常(至少在我们计划使用的硬件中)比可用RAM(存储
    MyData
    的地方)大得多
我已经搜索了很多类似的问题,除了编写我自己的序列化程序之外,我找不到任何能提供任何解决方案的建议

如果我要编写自己的序列化程序,我想:

  • 以YAML或JSON的形式存储“固定”字段
  • 在某个标记之后追加二进制数据
  • 首先将文件的顺序保持为“固定”字段,数据始终位于末尾
这样的解决方案将允许在“固定”字段区域内使用某些VT(版本容忍序列化),同时不会使文件大小膨胀。数据的格式是标准化的,实际上由外部硬件决定,但在标题(“固定”)字段中定义列表项结构也是一个选项

我不想重新发明轮子,因此我的问题是,您是否知道我的问题的现有解决方案。
如果没有,我自己的序列化方法是完整的还是遗漏了一些方面?

“如果我使用二进制格式化程序”-不,不要。请不要:“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();
    }
}