Ada beberapa hal yang terjadi. Yang utama adalah Anda harus menggunakan input apa pun jenisnya atau proses deserialisasi tidak sinkron. Saya telah menguji skenario Anda dengan menulis serializer khusus bernama ZipCodeSerializer yang menangani null dan menulis ZipCodes sebagai string, tetapi menerima string atau int pada input dan mengonversi int menjadi string.
Saya menggunakan kelas ini untuk menguji:
public class Address
{
public ObjectId Id;
public string ZipCode;
}
Dan ini adalah serializer khusus yang saya tulis:
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);
}
}
}
Anda harus memastikan serializer khusus terhubung, yang dapat Anda lakukan seperti ini:
BsonClassMap.RegisterClassMap<Address>(cm =>
{
cm.AutoMap();
cm.GetMemberMap(a => a.ZipCode).SetSerializer(new ZipCodeSerializer());
});
Jadi sekarang bidang ZipCode dari kelas Address akan ditangani oleh serializer khusus.
Saya membuat beberapa data pengujian menggunakan BsonDocument untuk memudahkan pemaksaan versi data tertentu yang disimpan dalam koleksi pengujian saya:
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));
Berikut tampilan dokumen menggunakan shell mongo:
> db.test.find()
{ "_id" : ObjectId("4f871374e447ad238040e346") }
{ "_id" : ObjectId("4f871374e447ad238040e347"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e348"), "ZipCode" : "12345" }
{ "_id" : ObjectId("4f871374e447ad238040e349"), "ZipCode" : 56789 }
>
jadi kita melihat bahwa beberapa ZipCodes adalah string dan beberapa adalah int (ada juga yang memasukkan null).
Dan ini adalah kode pengujian saya:
foreach (var document in collection.FindAll())
{
Console.WriteLine(document.ToJson());
}
Dan output dari menjalankan kode tes adalah:
{ "_id" : ObjectId("4f871374e447ad238040e346"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e347"), "ZipCode" : null }
{ "_id" : ObjectId("4f871374e447ad238040e348"), "ZipCode" : "12345" }
{ "_id" : ObjectId("4f871374e447ad238040e349"), "ZipCode" : "56789" }
Press Enter to continue
Perhatikan bahwa kode pos yang tadinya merupakan int dalam database sekarang menjadi string.
Kode sumber lengkap dari program pengujian saya tersedia di: