Хранить сериализованный объект вместе с его более простым вариантом в C# - PullRequest
1 голос
/ 30 апреля 2020

У меня большой класс переменных ~ 90i sh, например, так:

[Serializable]
[ProtoContract]
public class myLargeClass
{
    [ProtoMember(1)]
    public int BetId { get; set; }

    ...

    [ProtoMember(95)]
    public string someVariable { get; set; }
}

У меня есть большое количество этих объектов, которые я сохраняю на диске для своего приложения. Это сериализовано с использованием protobuf в один большой список и размещено на моем диске локально.

List<myLargeClass>

Идея состоит в том, что вместо десериализации всей вещи в большой класс я сделал более простую версию, которая содержит только подмножество переменных. Но также и байт [] сериализованного большого объекта, так что я могу получить доступ ко всем переменным в случае необходимости:

[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);
});

Это решение очень медленное, особенно если у вас есть сотни тысяч или миллионы объектов.

Как эффективно преобразовать сериализацию больших объектов в меньший объект?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

В соответствии с этим:

У меня есть большое количество этих объектов

Вы делаете много поисков в List, что составляет O(n) сложность. Преобразуйте List в Dictionary, а затем получите объект по Id:

var largeObjects = Serializer.Deserialize<List<myLargeClass>>(data).ToDictionary(x => x.Id, x => x);
...
var x = largeObjects[object.Id];
0 голосов
/ 05 мая 2020

Если вам нужны только небольшие данные, то отлично подойдет mySmallerClass без поля дополнительного блоба. Однако если вам нужно иметь возможность «обходить» поля, которые вы не отслеживаете:

[ProtoContract]
public class mySmallerClass : Extensible
{
    ...
}

Обратите внимание, что protobuf- net не ищет и не заботится о [Serializable] .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...