我有一大类〜90ish变量,如下所示:
[Serializable]
[ProtoContract]
public class myLargeClass
{
[ProtoMember(1)]
public int BetId { get; set; }
...
[ProtoMember(95)]
public string someVariable { get; set; }
}
我将大量这些对象保存到磁盘上以供应用程序使用。使用protobuf将它序列化为一个大列表,并放在本地磁盘上。
List<myLargeClass>
想法是,我没有将整个事情反序列化为大类,而是制作了一个仅包含变量子集的简单版本。而且还有序列化大对象的byte [],以便在需要时可以访问所有变量:
[Serializable]
[ProtoContract]
public class mySmallerClass
{
[ProtoMember(1)]
public int Id { get; set; }
...
[ProtoMember(10)]
public bool someVariable { get; set; }
public byte[] largeObject { get; set; }
}
我当前的解决方案很慢,因为我将序列化为小型和大型类:
var smallObjects = Serializer.Deserialize<List<mySmallerClass>>(data);
var largeObjects = Serializer.Deserialize<List<myLargeClass>>(data);
Parallel.ForEach(smallObjects, (object) =>
{
var x = largeObjects.Where(b => b.Id == object.Id).Single();
object.largeObject = Crypto.Serialize(x);
});
此解决方案非常慢,特别是当您有成千上万个对象时。
如何有效地将大对象序列化为较小的对象?
据此:
我有很多这些物品
您在List
中进行了大量查找,这是O(n)
的复杂性。将List
转换为Dictionary
,然后通过Id
获取对象:
var largeObjects = Serializer.Deserialize<List<myLargeClass>>(data).ToDictionary(x => x.Id, x => x);
...
var x = largeObjects[object.Id];