簡體   English   中英

使用簡單對象自定義復雜C#對象的血清

[英]Custom serilization of a complex C# object using simple objects

我正在使用QuickGraph的一個名為AdjacencyGraph的實用程序類,它具有復雜的內部結構。

我不關心復雜類的所有內部屬性,我不能將其更改為來自nuget包 - 最多在我的數據庫中我只關心存儲可用於重建AdacencyGraph的Dependency對象數組:

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

我該如何攔截序列化過程和輸出?

其他信息

我已經在一個列出所有Dependency對象的類中包裝了AdjacencyGraph,並且也可以接受一個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);
        }
    }
}

您需要做三件事:

  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直接剪切提供程序並注冊序列化程序,但我仍然建議將所有序列化程序分組到一個提供程序中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM