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

标签 c# .net linq protobuf-net

我们正在使用 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/

相关文章:

.net - 从挂起的更改中忽略某些文件

c# - 使用错误行号在 XSD 上验证 XML

c# - 在 Linq 一栏中加入 Records?

c# - 无法将类型为 'SZArrayEnumerator' 的对象转换为类型 'System.Collections.Generic.IEnumerator' 1[System.String]'

c# - MSTest,当具有测试类继承时,[ClassCleanup] 调用何时发生

c# - 首先使用实体​​框架代码为存储库实现通用方法

c# - 将 SqlDataReader 绑定(bind)到 Repeater。好的做法?

c# - 从 C# 中的列表中完全删除所有至少有一个重复项的元素

c# - 在 C# 中通过反射访问数据时的并发问题

.net - LINQ to SQL 左外连接