2014-12-18 4 views
6

Ho due classi, esempio:Usando C# MongoDB Driver, come serializzare una collezione di oggetti referee?

public class A 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    // Other properties... 
} 

public class B 
{ 
    public string Id { get; set; } 
    public ICollection<A> ReferredAObjects { get; set; } 
    // Other properties... 
} 

devo creare mappe di classe con BsonClassMap.RegisterClassMap() sia per A e B perché sono memorizzate separati in collezioni relative.

Il problema inizia quando provo a mappare B, perché ho bisogno di mappare la raccolta di A come riferimento a documenti esterni con alcune informazioni aggiuntive, quindi in questo caso ho bisogno di mappare solo ID e nomi.

Come è possibile creare una mappa di classi per B che utilizza una mappatura diversa per A solo al suo interno?

risposta

4

BsonClassMap non è la soluzione, si dovrebbe scrivere la vostra abitudine IBsonSerializer per B classe Ho appena implemeted il Serialize metodo, i Deserilze opere stesso modo.

public class BSerialzer : IBsonSerializer 
{ 
    public object Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options) 
    { 
     throw new NotImplementedException(); 
    } 

    public object Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) 
    { 
     throw new NotImplementedException(); 
    } 

    public IBsonSerializationOptions GetDefaultSerializationOptions() 
    { 
     throw new NotImplementedException(); 
    } 

    public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) 
    { 
     var b = (B)value; 
     bsonWriter.WriteStartDocument(); 

     bsonWriter.WriteString("_id", b.Id);    
     bsonWriter.WriteStartArray("refs"); 
     foreach (var refobj in b.ReferredAObjects) 
     { 
      bsonWriter.WriteString(refobj.Id); 
     } 
     bsonWriter.WriteEndArray();    

     bsonWriter.WriteEndDocument(); 
    } 
} 

per un campione sotto oggetti

var a0 = new A 
{ 
    Id = "0", 
    Name = "0", 
}; 

var a1 = new A 
{ 
    Id = "1", 
    Name = "1", 
}; 

var b = new B 
{ 
    Id = "b0", 
    ReferredAObjects = new Collection<A> { a0, a1 } 
}; 

collection.Insert(b); 

produrrà un output simile:

{ 
    "_id" : "b0", 
    "refs" : [ 
     "0", 
     "1" 
    ] 
} 

Basta ricordarsi di registrare questo Sterilizer al programma di start-up:

BsonSerializer.RegisterSerializer(typeof(B), new BSerialzer()); 
+0

Ok , Ho anche bisogno di salvare il nome in relazione con Id, ma ho capito il metodo! Grazie! – tmm360