使用简单对象自定义序列化复杂c#对象

本文关键字:复杂 对象 序列化 自定义 简单 单对象 | 更新日期: 2023-09-27 18:09:55

我正在使用QuickGraph的一个名为AdjacencyGraph的实用程序类,它具有复杂的内部结构。

我不关心复杂类的所有内部属性,我不能改变它,因为它是从一个nuget包-最多在我的数据库中,我只关心存储一个可以用来重建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对象:

Dependencies Deserialize(IEnumerable<Dependency> hydrateFrom)
{
    var dependencies = new Dependencies();
    foreach(var d in hydrateFrom)
    {
        dependencies.SetRequiresFor(d.Source, d.Target);
    }
}

我该如何拦截序列化过程和输出?

其他信息

我把邻接图包装在一个类中,这个类列出了所有的依赖对象,并且可以接受一个依赖对象的列表。

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

使用简单对象自定义序列化复杂c#对象

你需要做三件事:

  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;
    }
}
在注册

BsonSerializer.RegisterSerializationProvider(new BsonSerializationProvider());

*您可以切断提供程序并直接使用BsonSerializer.RegisterSerializer注册序列化器,但我仍然建议将所有序列化器分组到单个提供程序中