我们正在使用 ProtoBuf.NET 将报告序列化为文件(使用 DataContract/DataMember 属性来标记我们感兴趣的字段)。有什么方法(在运行时)来标记我们想要反序列化回哪些字段?
我们需要此功能,因为我们正在处理大数据(100 万行,包含 250 多行数据)。并且根据我们对其运行的 linq 查询,只想加载/填充所需的字段(主要是为了节省内存占用)。
是的,我们使用 IEnum 方式检索数据,但是如果您在 linq 中执行任何 GroupBy,它会尝试加载导致 OutOfMem 的所有内容(因为其中字段太多)。
最佳答案
嗯,有,但是...
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>
关于c# - ProtoBuf.NET - 选择要在运行时加载的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24203363/