2011-11-15 16 views
6

ile saklanması Onların anlamında polimorfik değerler içeren bir anahtarımız olduğunu varsayalım. Bir sonraki örnek proje düşünün:Sözcüğün polimorfik değerlerle mongoDB kullanılarak C#

public class ToBeSerialized 
{ 
    [BsonId] 
    public ObjectId MongoId; 
    public IDictionary<string, BaseType> Dictionary; 
} 

public abstract class BaseType 
{ 
} 

public class Type1 : BaseType 
{ 
    public string Value1; 
} 

public class Type2:BaseType 
{ 
    public string Value1; 
    public string Value2; 
} 


internal class Program 
{ 
    public static void Main() 
    { 
     var objectToSave = new ToBeSerialized 
           { 
            MongoId = ObjectId.GenerateNewId(), 
            Dictionary = new Dictionary<string, BaseType> 
                { 
                 {"OdEd1", new Type1 {Value1="value1"}}, 
                 { 
                  "OdEd2", 
                  new Type1 {Value1="value1"} 
                  } 
                } 
           }; 
     string connectionString = "mongodb://localhost/Serialization"; 
     var mgsb = new MongoUrlBuilder(connectionString); 
     var MongoServer = MongoDB.Driver.MongoServer.Create(mgsb.ToMongoUrl()); 
     var MongoDatabase = MongoServer.GetDatabase(mgsb.DatabaseName); 
     MongoCollection<ToBeSerialized> mongoCollection = MongoDatabase.GetCollection<ToBeSerialized>("Dictionary"); 
     mongoCollection.Save(objectToSave); 

     ToBeSerialized received = mongoCollection.FindOne(); 
    } 
} 

Bazen bu serisini çalıştığınızda, ben "Bilinmeyen ayırt edici değeri 'beton türünün adını'" gibi seri kaldırma hataları olsun. Neyi yanlış yapıyorum? Her değer bir _t saklarsa neden doğru şekilde eşleyemez?

cevap

9

Sürücü bilmelidir. Bunun 1.Register

küresel uygulama başlangıcında sırasında: bunu yapmak için iki yol vardır

[BsonKnownTypes(typeof(Type1), typeof(Type2)] 
public class BaseType 
{ 

} 

# 1 kullanın veya olacaksa:

BsonClassMap.RegisterClassMap<Type1>(); 
BsonClassMap.RegisterClassMap<Type2>(); 

2.Or BsonKnownTypes attibute olsa # 2 serileştirme işleminiz doğru şekilde çalışacaktır.

3

Onları serileştirmek için denemeden önce hangi türleri BaseClass'dan devralmanız gerektiğini kaydetmeniz gerekir. İlk önce serileştirirseniz, bu otomatik olarak gerçekleşir, bu muhtemelen hatanın neden sadece bazen gerçekleştiğini gösterir.

Bir özniteliği kullanılarak türetilmiş türlerini kayıt olabilirsiniz: Tüm Diskriminatörleri hatasız herhangi bir sınıf serisini yaklaşık

[BsonDiscriminator(Required = true)] 
[BsonKnownTypes(typeof(DerivedType1), typeof(DerivedType2))] 
public class BaseClass { ... } 

public class DerivedType1 : BaseClass { ... } 
+0

Çocuklar, teşekkürler. Şimdi benim cevabım –

+2

kabul etmek için bir ikilem var Peki, Andrew'un cevabı daha eksiksiz. “BsonClassMap.RegisterClassMap” çağrısının sözdizimini unuttuğumu itiraf etmeliyim, ve baktığımda, Andrew cevabını yazmıştı. Genel olarak daha eksiksiz bir cevabı tercih ederim, çünkü diğer kullanıcılar büyük olasılıkla kabul edilen cevaba bir göz atacaktır. – mnemosyn