[英]Mongo DB Class Refactoring
在以下情況下,重寫Mongo序列化程序的最佳方法是:
我有以下課程
public Class Quest
{
public ObjectId _id {get; set;}
public string Name {get; set;}
public List<string> GalleryImagePaths {get; set;}
}
進行重構后,GalleryImagePaths屬性將重構為
public List<HttpFile> GalleryImagePaths {get; set;}
public Class HttpFile
{
string FilePath {get; set;}
string UriPath {get; set;}
}
現在默認的序列化器無法反序列化為
List<string> GalleryImagePaths
並且新的數據文檔將存儲在新的架構中。
什么是最佳做法?
BsonSerializer
類是靜態且不可繼承的,因此在這種情況下,我認為自定義序列化器將有助於序列化/反序列化。
例如:
using System.Reflection;
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;
// Custom Serializer
public static class MyBsonSerializer
{
public static Quest DeserializeQuest(BsonDocument bson)
{
Quest quest = new Quest();
var properties = typeof(Quest).GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();
foreach (var element in bson.Elements)
{
switch (element.Name)
{
case "GalleryImagePaths":
List<HttpFile> paths = new List<HttpFile>();
foreach (var path in element.Value.AsBsonArray)
{
var httpFile = new HttpFile();
// Set FilePath and UriPath
paths.Add(httpFile);
}
quest.GalleryImagePaths = paths;
break;
case "_id":
properties.First(p => p.Name == element.Name).SetValue(quest, new ObjectId(element.Value.ToString()));
break;
case "Name":
properties.First(p => p.Name == element.Name).SetValue(quest, element.Value.ToString());
break;
}
}
return quest;
}
public static BsonDocument SerializeQuest(Quest quest)
{
BsonDocument bson = new BsonDocument();
bson.Add(new BsonElement("Name", quest.Name));
var paths = quest.GalleryImagePaths.Select(h => h.UriPath);
// OR quest.GalleryImagePaths.Select(h => h.FilePath)
bson.Add(new BsonElement("GalleryImagePaths", new BsonArray(paths)));
return bson;
}
}
反序列化:
var collection = db.GetCollection<BsonDocument>("Quest");
var filter = Builders<BsonDocument>.Filter.Eq("Name", "sample");
Quest quest = MyBsonSerializer.DeserializeQuest(collection.Find(filter).FirstOrDefault());
序列化(和插入):
collection.InsertOne(MyBsonSerializer.SerializeQuest(quest));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.