我们正在使用ProtoBuf.NET将报表序列化为文件(使用DataContract / DataMember属性来标记我们感兴趣的字段)。有没有办法(在运行时)标记我们想要反序列化的字段?
我们需要此功能,因为我们正在处理大数据(1Mln行,250行以上的数据)。并且根据linq查询我们对它运行,只想加载/填充所需的字段(主要是为了节省内存占用)。
是的,我们正在使用IEnum检索数据的方式,但如果您在linq中执行任何GroupBy,它会尝试加载导致OutOfMem的所有内容(因为其中包含太多字段)。
答案 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>