سلام و وقت بخیر به همه اعضا
داخل کالکشنی در مونگو اطلاعاتی دارم که با schema مختلفی به صورت زیر ذخیره شده اند:
{
...
phones:
{
0: {number:"123"},
1: {number:"456"}
}
...
}
و ساختار دوم:
{
...
phones:
[
{number:"123"},
{number:"456"}
]
...
}
یکی لیستی از آبجکت ها را در phones ذخیره شده و یکی آبجکت ها را به صورت آرایه داخل phones ذخیره کرده است.
بعد از کمی جست و جو به راه حلی رسیدم که بتونم schema های مختلف را با override کردن متد Deserialize هدنل کنم و به مدل anotation زیر را اضافه کردم:
public class Order
{
...
[BsonSerializer(typeof( FixingPhonesObjectSerialaizer ))]
public List<Phone> phones { get; set; }
...
}
و داخل کلاس FixingPhonesObjectSerialaizer متد های لازم را به شکل زیر override کردم:
public override List<Phone?> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
if (context.Reader.CurrentBsonType == BsonType.Document)
{
List<Phone?> phones = new List<Phone?>();
var bsonReader = context.Reader;
bsonReader.ReadStartDocument();
IDiscriminatorConvention valueDiscriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeo f(object));
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
{
string key = bsonReader.ReadName();
Type valueType = valueDiscriminatorConvention.GetActualType(bsonRea der, typeof(object));
IBsonSerializer valueSerializer = BsonSerializer.LookupSerializer(valueType);
object value = valueSerializer.Deserialize(context);
phones.Add(BsonSerializer.Deserialize<Phone>(value .ToBsonDocument()));
}
bsonReader.ReadEndDocument();
return phones;
}
return base.Deserialize(context, args);
}
protected override void AddItem(object accumulator, object item)
{
((List<Phone?>)accumulator).Add(BsonSerializer.Des erialize<Phone>(item.ToBsonDocument()));
}
protected override object CreateAccumulator()
{
return new List<Phone?>();
}
protected override IEnumerable EnumerateItemsInSerializationOrder(List<Phone?> value)
{
return value;
}
protected override List<Phone> FinalizeResult(object accumulator)
{
return (List<Phone?>)accumulator;
}
}
فراخوانی داده ها بدون مشکل انجام میشه اما موقع ذخیره سازی داده ها عملیات serialize با مشکل مواجه میشه و خطای زیر را دریافت میکنم:
An error occurred while serializing the phones property of class App.Models.Order: Type App.Models.Phone is not configured as a type that is allowed to be serialized for this instance of ObjectSerializer.
برای رفع مشکل به ذهنم رسید که تابع serialize را هم override کنم اما نمیدونم داخل تابع چی باید بنویسم که مشکل حل بشه:
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, List<Phone> value)
{
base.Serialize(context, args, value);
}
آیا شما راهکاری بهتری برای کنترل schema های مختلف داده هایی که از پایگاه داده مونگو خوانده میشه دارید یا روش درست serialize کردن داده ها را میدونید؟
پیشاپیش از دوستانی که راهنمایی میکنند تشکر میکنم.