एक दो बातें चल रही हैं। मुख्य बात यह है कि आपको किसी भी प्रकार की परवाह किए बिना इनपुट का उपभोग करना होगा या अक्रमांकन प्रक्रिया सिंक से बाहर हो जाती है। मैंने आपके परिदृश्य का परीक्षण ज़िपकोडसेरियलाइज़र नामक एक कस्टम सीरिएलाइज़र लिखते हुए किया है जो नल को संभालता है और ज़िपकोड को स्ट्रिंग के रूप में लिखता है, लेकिन इनपुट पर स्ट्रिंग या इनट्स को स्वीकार करता है और इनट्स को स्ट्रिंग में परिवर्तित करता है।
मैंने इस वर्ग का परीक्षण करने के लिए उपयोग किया:
public class Address
{
public ObjectId Id;
public string ZipCode;
}
और यह कस्टम सीरिएलाइज़र मैंने लिखा है:
public class ZipCodeSerializer : BsonBaseSerializer
{
public override object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
{
var bsonType = bsonReader.CurrentBsonType;
switch (bsonType)
{
case BsonType.Null:
bsonReader.ReadNull();
return null;
case BsonType.String:
return bsonReader.ReadString();
case BsonType.Int32:
return bsonReader.ReadInt32().ToString();
default:
var message = string.Format("ZipCodeSerializer expects to find a String or an Int32, not a {0}.", bsonType);
throw new BsonSerializationException(message);
}
}
public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
{
if (value == null)
{
bsonWriter.WriteNull();
}
else
{
bsonWriter.WriteString((string)value);
}
}
}
आपको यह सुनिश्चित करना होगा कि कस्टम सीरिएलाइज़र जुड़ा हुआ है, जो आप इस तरह कर सकते हैं:
BsonClassMap.RegisterClassMap<Address>(cm =>
{
cm.AutoMap();
cm.GetMemberMap(a => a.ZipCode).SetSerializer(new ZipCodeSerializer());
});
तो अब पता वर्ग के ज़िपकोड फ़ील्ड को कस्टम सीरिएलाइज़र द्वारा नियंत्रित किया जाएगा।
मैंने अपने परीक्षण संग्रह में डेटा के विशेष संग्रहीत संस्करणों को बाध्य करना आसान बनाने के लिए BsonDocument का उपयोग करके कुछ परीक्षण डेटा बनाया:
collection.Drop();
collection.Insert(new BsonDocument());
collection.Insert(new BsonDocument("ZipCode", BsonNull.Value));
collection.Insert(new BsonDocument("ZipCode", "12345"));
collection.Insert(new BsonDocument("ZipCode", 56789));
यहां बताया गया है कि मोंगो शेल का उपयोग करते हुए दस्तावेज़ कैसा दिखते हैं:
> db.test.find()
{ "_id" : ObjectId("4f871374e447ad238040e346") }
{ "_id" : ObjectId("4f871374e447ad238040e347"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e348"), "ZipCode" : "12345" }
{ "_id" : ObjectId("4f871374e447ad238040e349"), "ZipCode" : 56789 }
>
इसलिए हम देखते हैं कि कुछ ज़िपकोड स्ट्रिंग हैं और कुछ इनट्स हैं (इसमें एक नल भी है)।
और यह मेरा परीक्षण कोड है:
foreach (var document in collection.FindAll())
{
Console.WriteLine(document.ToJson());
}
और परीक्षण कोड चलाने का आउटपुट है:
{ "_id" : ObjectId("4f871374e447ad238040e346"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e347"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e348"), "ZipCode" : "12345" }
{ "_id" : ObjectId("4f871374e447ad238040e349"), "ZipCode" : "56789" }
Press Enter to continue
ध्यान दें कि ज़िपकोड जो डेटाबेस में एक इंट था अब एक स्ट्रिंग है।
मेरे परीक्षण कार्यक्रम का पूरा स्रोत कोड यहां उपलब्ध है: