ProtoBuf.NET - 选择要在运行时加载的字段

时间:2014-06-13 10:37:21

标签: c# .net linq protobuf-net

我们正在使用ProtoBuf.NET将报表序列化为文件(使用DataContract / DataMember属性来标记我们感兴趣的字段)。有没有办法(在运行时)标记我们想要反序列化的字段?

我们需要此功能,因为我们正在处理大数据(1Mln行,250行以上的数据)。并且根据linq查询我们对它运行,只想加载/填充所需的字段(主要是为了节省内存占用)。

是的,我们正在使用IEnum检索数据的方式,但如果您在linq中执行任何GroupBy,它会尝试加载导致OutOfMem的所有内容(因为其中包含太多字段)。

1 个答案:

答案 0 :(得分:4)

嗯,,但是......

var model = RuntimeTypeModel.Create();
var metaType = model.Add(typeof(Foo), false);
if(includeA) metaType.Add(1, "A");
//...
if(includeXYZ) metaType.Add(42, "XYZ");
var foo = (Foo)model.Deserialize(source, typeof(Foo));

但请注意,这将导致它为每个RuntimeTypeModel实例执行所有程序集生成等 - 您可能希望为每个字段子集缓存一个模型。如果您选择字段是通过[Flags]枚举,这可能非常简单,因为您可以使用Dictionary<YourFields, RuntimeTypeModel>