0

Mongoカスタムシリアライゼーションでは、どうすればobjectIdを取得できますか?

IBsonSerializer を実装しましたが、データは希望どおりにデータベースに表示されています。ただし、以前は 5236ea9949444a06d7f50012 のような ObjectId を持っていたコレクションに挿入した後、私の ObjectId は空 (000000000000000000000000) になりました。ObjectId がデータベースにあることがわかりますので、そこにあることがわかります。コレクションに挿入した後、C# オブジェクトに入力されていません。

これが私のコードです:

public class EvaluationResultMongoSerializer : IBsonSerializer
{

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

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

    public IBsonSerializationOptions GetDefaultSerializationOptions()
    {
        return null;
    }

    public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
    {

        EvaluationResult er = (EvaluationResult)value;
        bsonWriter.WriteStartDocument();
        bsonWriter.WriteDouble("Duration", er.DurationInSeconds);
        bsonWriter.WriteDateTime("Start", BsonUtils.ToMillisecondsSinceEpoch(er.startTime));
        bsonWriter.WriteDateTime("End", BsonUtils.ToMillisecondsSinceEpoch(er.endTime));
        bsonWriter.WriteString("Result", er.Result.ValueAsString);
        bsonWriter.WriteEndDocument();
    }
}

次のようにマッピングを登録します。

BsonSerializer.RegisterSerializer(
            typeof(EvaluationResult),
            new EvaluationResultMongoSerializer()
        );

クラスマップを登録していません。

4

1 に答える 1

0

私はそれを働かせました。私は2つのことをしました。私は2番目のことだけをする必要があったかもしれません。

  1. 実装された IBsonIdProvider - これには GetDocumentId と SetDocumentId があります - これを行う必要があるかどうかわかりません。
  2. 私のシリアル化メソッドでは、要素名「_id」でobjectidをシリアル化します-これを行うには間違いなく必要でした。

これが私のコードです:

public class EvaluationResultMongoSerializer : IBsonSerializer, IBsonIdProvider 
{

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

    public object Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
    {
        EvaluationResult er = new EvaluationResult();
        bsonReader.ReadStartDocument();
        er.Id = bsonReader.ReadObjectId();
        er.DurationInSeconds = bsonReader.ReadDouble();
        er.startTime = BsonUtils.ToDateTimeFromMillisecondsSinceEpoch(bsonReader.ReadDateTime());
        er.endTime = BsonUtils.ToDateTimeFromMillisecondsSinceEpoch(bsonReader.ReadDateTime());
        er.Result = EvaluationStatus.Parse(bsonReader.ReadString());
        er.JSON = bsonReader.ReadString();
        bsonReader.ReadEndDocument();
        return er;
    }

    public IBsonSerializationOptions GetDefaultSerializationOptions()
    {
        return null;
    }

    public void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
    {
        EvaluationResult er = (EvaluationResult)value;

        bsonWriter.WriteStartDocument();
        bsonWriter.WriteObjectId("_id", er.Id);
        bsonWriter.WriteDouble("Duration", er.DurationInSeconds);
        bsonWriter.WriteDateTime("Start", BsonUtils.ToMillisecondsSinceEpoch(er.startTime));
        bsonWriter.WriteDateTime("End", BsonUtils.ToMillisecondsSinceEpoch(er.endTime));
        bsonWriter.WriteString("Result", er.Result.ValueAsString);
        bsonWriter.WriteString("JSON", er.JSON);
        bsonWriter.WriteEndDocument();
    }

    public bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator)
    {
        idNominalType = typeof(ObjectId);
        idGenerator = ObjectIdGenerator.Instance;

        var mongoDocument = document as EvaluationResult;
        if (mongoDocument == null)
        {
            id = null;
            return false;
        }

        id = mongoDocument.Id;
        return true;
    }

    public void SetDocumentId(object document, object id)
    {
        var mongoDocument = document as EvaluationResult;
        if (mongoDocument != null)
        {
            mongoDocument.Id = (ObjectId)id;
        }
    }
}
于 2013-09-17T01:00:50.617 に答える