6

[BsonRepresentation(BsonType.String)]現在、ドメインモデルのすべてのGuidプロパティに属性を適用して、それらのプロパティを文字列形式でシリアル化しています。Wrapper<T>面倒なだけでなく、カスタムクラスなどではうまくいかないこともあります。

public class Wrapper<T>
{
    public T Value { get; set; }

    // Further properties / business logic ...
}

の場合、プロパティTはタイプのバイナリデータとして保存されます(上記の属性で装飾されていないタイプのプロパティも同様です)。ただし、を含むすべてのsをデータベースで文字列として表現したいと思います。GuidValueUuidLegacyGuidGuidWrapper<Guid>.Value

Guidすべてのを文字列形式で保存するようにMongoDBC#ドライバーに指示する方法はありますか?

4

4 に答える 4

8

これは、コンベンションを使用して達成することができます

次のようなもの:

var myConventions = new ConventionProfile();
myConventions.SetSerializationOptionsConvention(
    new TypeRepresentationSerializationOptionsConvention(typeof (Guid), BsonType.String));

BsonClassMap.RegisterConventions(myConventions, t => t == typeof (MyClass));

これは、アプリのスタートアップのどこかにあるはずです。

規則について詳しくは、http ://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Conventionsをご覧ください。

于 2012-12-13T16:22:30.540 に答える
4

規則を使用することは機能しますが、2つの重要な(および関連する)点に注意してください。

  1. このfilterパラメーターは必須であり、フィルターが一般的すぎる場合(例t => true:)、他の登録済み規則を上書きする可能性があります。
  2. 登録された規則の順序が重要であることに注意してください。最初に特定のフィルターを登録し、その後に一般的な規則を登録します。

もう1つのオプションは、GuidタイプのBSONクラスマップを作成することです。これにより、表現が文字列に設定されます。

if (!BsonClassMap.IsClassMapRegistered(typeof(Guid))) {
    BsonClassMap.RegisterClassMap<Guid>(cm => {
        cm.AutoMap();
        cm.Conventions.SetSerializationOptionsConvention(new  TypeRepresentationSerializationOptionsConvention(typeof(Guid), BsonType.String));
    });
}

これは、BsonSerializerを使用して読み取り/書き込みを行う前に行う必要があります。そうしないと、デフォルトのクラスマップが作成され、クラスマップを変更できなくなります。

于 2013-03-18T12:15:55.690 に答える
4

ConventionProfile は廃止されました。ルールをグローバルに適用するのではなく、特定のクラスにのみ適用する場合 (これは、アプリのスタートアップのどこかに移動する必要があります):

var pack = new ConventionPack { new GuidAsStringRepresentationConvention () };
ConventionRegistry.Register("GuidAsString", pack, t => t == typeof (MyClass));

public class GuidAsStringRepresentationConvention : ConventionBase, IMemberMapConvention
    {
        public void Apply(BsonMemberMap memberMap)
        {
            if (memberMap.MemberType == typeof(Guid))
            {
                var serializer = memberMap.GetSerializer();
                var representationConfigurableSerializer = serializer as IRepresentationConfigurable;
                if (representationConfigurableSerializer != null)
                {
                    var reconfiguredSerializer = representationConfigurableSerializer.WithRepresentation(BsonType.String);
                    memberMap.SetSerializer(reconfiguredSerializer);
                }
            }
        }
    }
于 2015-10-21T11:29:45.860 に答える