[英]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);
}
}
}
您需要做三件事:
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
直接剪切提供程序並注冊序列化程序,但我仍然建議將所有序列化程序分組到一個提供程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.