Я использую служебный класс от 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);
}
}
}
Вам нужно сделать 3 вещи:
BsonSerializer
.BsonSerializationProvider
который будет указывать Dependencies
для вашего сериализатора. *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
}
}
public sealed class BsonSerializationProvider : IBsonSerializationProvider
{
public IBsonSerializer GetSerializer(Type type)
{
if (type == typeof(Dependncies)
{
return new DependenciesBsonSerializer ();
}
return null;
}
}
BsonSerializer.RegisterSerializationProvider(new BsonSerializationProvider());
* Вы можете отключить провайдера и зарегистрировать сериализатор напрямую с помощью BsonSerializer.RegisterSerializer
но я по-прежнему рекомендую группировать все ваши сериализаторы в одном провайдере.