为了将Guid序列化为字符串,我没有任何问题,因为我正在使用这段代码。https:/stackoverflow.coma332581684148788。
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);
}
}
}
}
如果我尝试对Guid做同样的事情,它就不工作了。
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);
}
}
这一行总是空的。
var representationConfigurableSerializer = serializer as IRepresentationConfigurable;
对于可空的Guid,你是怎么做的?
你是需要重新配置当前的序列器还是可以直接替换掉,替换掉会更简单。
可空类型的BSON序列器被包装在一个装饰器序列器类型(NullableSerializer<>
),我们可以只检查 MemberType
是 Nullable<Guid>
并为你的方案设置正确的序列器。
请看下面的约定代码。
public class GuidAsStringRepresentationConvention : ConventionBase, IMemberMapConvention
{
public void Apply(BsonMemberMap memberMap)
{
if (memberMap.MemberType == typeof(Guid))
{
memberMap.SetSerializer(new GuidSerializer(BsonType.String));
}
else if (memberMap.MemberType == typeof(Guid?))
{
memberMap.SetSerializer(new NullableSerializer<Guid>(new GuidSerializer(BsonType.String)));
}
}
}