Пользовательская серилизация сложного объекта C # с использованием простых объектов

1

Я использую служебный класс от QuickGraph называется AdjacencyGraph, который имеет сложную внутреннюю структуру.

Я не забочусь обо всех внутренних свойствах сложного класса, и я не могу изменить его как его из пакета nuget - самое большее в моей базе данных. Я просто заинтересован в хранении массива объектов Dependency, которые могут быть использованы для восстановления AdacencyGraph:

public class Dependency
{
    public Dependency(string source, string target)
    {
        this.Source = source;
        this.Target = target;
    }

    public string Source { get; set; }
    public string Target { get; set; }
}

При сериализации все, что мне нужно сделать, это следующий код:

void Serialize(Dependencies toSerialize)
{
    var toBeStored = toSerialize.GetAllDependencies();
    // write this to mongodb somehow
}

И десериализация построит объект "Зависимости":

Dependencies Deserialize(IEnumerable<Dependency> hydrateFrom)
{
    var dependencies = new Dependencies();

    foreach(var d in hydrateFrom)
    {
        dependencies.SetRequiresFor(d.Source, d.Target);
    }
}

Вопрос

Как я могу перехватить процесс сериализации и вывода?

Дополнительная информация

Я завернул AdjacencyGraph в классе, который перечисляет все объекты Dependency, и может также принимать список объектов Dependency.

class Dependencies
{
    private AdjacencyGraph<string, Edge<string>> relationshipGraph = new AdjacencyGraph<string, Edge<string>>();

    public void SetRequiresFor(SkuId on, SkuId requires)
    {
        var toAdd = new Edge<string>(on.Value, requires.Value);
        this.relationshipGraph.AddVerticesAndEdge(toAdd);

    }

    public IEnumerable<Dependency> GetAllDependencies()
    {
        foreach(var edge in this.relationshipGraph.Edges)
        {
            yield return new Dependency(edge.Source, edge.Target);
        }
    }
}
Теги:
serialization
mongodb-.net-driver

1 ответ

3
Лучший ответ

Вам нужно сделать 3 вещи:

  1. Внедрение BsonSerializer.
  2. Внедрите BsonSerializationProvider который будет указывать Dependencies для вашего сериализатора. *
  3. Зарегистрируйте поставщика в инициализации вашего приложения.

BsonSerializer

public class DependenciesBsonSerializer : BsonBaseSerializer
{
    public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
    {
        // implement using bsonWriter
    }

    public override object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
    {
        // implement using bsonReader
    }
}

BsonSerializationProvider

public sealed class BsonSerializationProvider : IBsonSerializationProvider
{
    public IBsonSerializer GetSerializer(Type type)
    {
        if (type == typeof(Dependncies)
        {
            return new DependenciesBsonSerializer ();
        }

        return null;
    }
}

Registeration

BsonSerializer.RegisterSerializationProvider(new BsonSerializationProvider());

* Вы можете отключить провайдера и зарегистрировать сериализатор напрямую с помощью BsonSerializer.RegisterSerializer но я по-прежнему рекомендую группировать все ваши сериализаторы в одном провайдере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню