将序列化对象及其在C#中的简单变体一起存储

问题描述 投票:0回答:1

我有一大类〜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);
});

此解决方案非常慢,特别是当您有成千上万个对象时。

如何有效地将大对象序列化为较小的对象?

c# protobuf-net
1个回答
0
投票

据此:

我有很多这些物品

您在List中进行了大量查找,这是O(n)的复杂性。将List转换为Dictionary,然后通过Id获取对象:

var largeObjects = Serializer.Deserialize<List<myLargeClass>>(data).ToDictionary(x => x.Id, x => x);
...
var x = largeObjects[object.Id];
© www.soinside.com 2019 - 2024. All rights reserved.