【问题标题】:Custom serilization of a complex C# object using simple objects使用简单对象对复杂 C# 对象进行自定义序列化
【发布时间】:2014-06-21 13:08:45
【问题描述】:

我正在使用 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 对象:

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

【问题讨论】:

    标签: c# .net mongodb serialization mongodb-.net-driver


    【解决方案1】:

    你需要做三件事:

    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 直接注册序列化程序,但我仍然建议将所有序列化程序分组到一个提供程序中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2011-08-22
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多