C# 你能在Google';s协议缓冲区格式?

C# 你能在Google';s协议缓冲区格式?,c#,serialization,csv,protocol-buffers,C#,Serialization,Csv,Protocol Buffers,我最近发现了协议缓冲区,并想知道它们是否可以应用于我的特定问题 基本上,我有一些CSV数据,我需要转换成一个更紧凑的格式来存储,因为有些文件是几gig的 CSV中的每个字段都有一个标题,只有两种类型,字符串和小数(因为有时有很多有效数字,我需要以相同的方式处理所有数字)。但是每个文件的每个字段都有不同的列名 除了捕获原始CSV数据,我还需要能够在保存之前向文件添加额外信息。我希望通过处理不同的文件版本来证明这一点 那么,是否可以使用协议缓冲区来捕获随机命名的数据列,如CSV文件?好的,proto

我最近发现了协议缓冲区,并想知道它们是否可以应用于我的特定问题

基本上,我有一些CSV数据,我需要转换成一个更紧凑的格式来存储,因为有些文件是几gig的

CSV中的每个字段都有一个标题,只有两种类型,字符串和小数(因为有时有很多有效数字,我需要以相同的方式处理所有数字)。但是每个文件的每个字段都有不同的列名

除了捕获原始CSV数据,我还需要能够在保存之前向文件添加额外信息。我希望通过处理不同的文件版本来证明这一点

那么,是否可以使用协议缓冲区来捕获随机命名的数据列,如CSV文件?

好的,protobuf-net(我的版本)基于常规的.net类型,所以不可以(因为它不会一直处理不同的模式)。但Jon的版本可能允许动态类型。就我个人而言,我只需要使用CSV并通过GZipStream运行它——我希望这样就可以了


编辑:事实上,我忘了:protobuf net确实支持可扩展对象,但您需要小心一点。。。我想这将取决于整个环境


另外,Jon的嵌套数据方法可能也会起作用。

好吧,它当然是可表示的。比如:

message CsvFile {
    repeated CsvHeader header = 1;
    repeated CsvRow row = 2;
}

message CsvHeader {
    require string name = 1;
    require ColumnType type = 2;
}

enum ColumnType {
    DECIMAL = 1;
    STRING = 2;
}

message CsvRow {
    repeated CsvValue value = 1;
}

// Note that the column is implicit based on position within row    
message CsvValue {
    optional string string_value = 1;
    optional Decimal decimal_value = 2;
}

message Decimal {
    // However you want to represent it (there are various options here)
}

我不确定它能带来多少好处,请注意。。。您当然可以添加更多信息(添加到CsvFile消息中),未来的校对方式是“普通PB方式”-仅添加可选字段等。

对不起,我不确定是否已明确-我还将向CSV添加额外数据,有时作为额外列,有时作为页眉或页脚数据。这个数据我想进行版本验证。这就是为什么我在考虑其他的存储方法。是的,阅读PBs编码并没有让我充满希望,因为我的数据主要是密集的数字。不过,我还是会尝试一下,看看会发生什么。如果你对PB中的System.Decimal表示法感兴趣,那可能需要一个单独的问题,或者在PB讨论组上发表一篇文章。马克和我以前讨论过这个问题(今晚可能会做得更多,马克?)。