Ich habe festgestellt, dass es in einigen Fällen nicht ausreicht , nur die Antwort von Ricardo Rodriguez anzuwenden , um die Enum-Werte für die Zeichenfolge in MongoDb ordnungsgemäß zu serialisieren:
var pack = new ConventionPack
{
new EnumRepresentationConvention(BsonType.String)
};
ConventionRegistry.Register("EnumStringConvention", pack, t => true);
Wenn Ihre Datenstruktur beinhaltet, dass Enum-Werte in Objekte gepackt werden, verwendet die MongoDb-Serialisierung das Set nicht EnumRepresentationConvention
zum Serialisieren.
Wenn Sie sich die Implementierung des ObjectSerializer des MongoDb-Treibers ansehen , wird der BoxwertTypeCode
( Int32
für Aufzählungswerte) aufgelöst und dieser Typ zum Speichern Ihres Aufzählungswerts in der Datenbank verwendet. Boxed Enum-Werte werden also als int
Werte serialisiert . Sie bleiben auch int
bei der Deserialisierung als Werte erhalten.
Um dies zu ändern, können Sie eine benutzerdefinierte ObjectSerializer
Datei schreiben , die die Menge erzwingt, EnumRepresentationConvention
wenn der umrahmte Wert eine Aufzählung ist. Etwas wie das:
public class ObjectSerializer : MongoDB.Bson.Serialization.Serializers.ObjectSerializer
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
var bsonWriter = context.Writer;
if (value != null && value.GetType().IsEnum)
{
var conventions = ConventionRegistry.Lookup(value.GetType());
var enumRepresentationConvention = (EnumRepresentationConvention) conventions.Conventions.FirstOrDefault(convention => convention is EnumRepresentationConvention);
if (enumRepresentationConvention != null)
{
switch (enumRepresentationConvention.Representation)
{
case BsonType.String:
value = value.ToString();
bsonWriter.WriteString(value.ToString());
return;
}
}
}
base.Serialize(context, args, value);
}
}
Legen Sie dann den benutzerdefinierten Serializer als den für die Serialisierung von Objekten zu verwendenden fest:
BsonSerializer.RegisterSerializer(typeof(object), new ObjectSerializer());
Auf diese Weise wird sichergestellt, dass die Aufzählungswerte in Kästchen genauso wie die nicht in Kästchen verpackten Zeichenfolgen gespeichert werden.
Beachten Sie jedoch, dass beim Deserialisieren Ihres Dokuments der Wert in der Box eine Zeichenfolge bleibt. Es wird nicht wieder in den ursprünglichen Aufzählungswert konvertiert. Wenn Sie die Zeichenfolge wieder in den ursprünglichen Aufzählungswert konvertieren müssen, muss wahrscheinlich ein Unterscheidungsfeld in Ihr Dokument eingefügt werden, damit der Serializer weiß, in welchen Aufzählungstyp derrialisiert werden soll.
Eine Möglichkeit wäre, ein bson-Dokument anstelle einer Zeichenfolge zu speichern, in dem das Unterscheidungsfeld ( _t
) und ein Wertefeld ( _v
) zum Speichern des Aufzählungstyps und seines Zeichenfolgenwerts verwendet werden.