如何在 dotnet 中实现 IBsonSerializer
How to implement IBsonSerializer in dotnet
我正在使用 MongoDB,我需要创建一个可以作为 提供程序 注入的序列化程序,而无需使用 class 装饰BsonSerializerAttribute.
我这样注册为提供商:
BsonSerializer.RegisterSerializer(typeof(SexType), new SexTypeSerializer());
我总是会遇到异常,因为 对象值 在此方法中始终为 null。
我该如何解决这个问题?
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
这是我实现的class。
public class SexTypeSerializer : IBsonSerializer<SexType>
{
public Type ValueType
{
get { return typeof(SexType); }
}
public SexTypeSerializer() { }
public SexType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var value = context.Reader.ReadString();
return SexType.FromCode(value);
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SexType value)
{
BsonSerializer.Serialize(context.Writer, value.Code);
}
object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
return SexType.FromCode(BsonSerializer.Deserialize<string>(context.Reader));
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
if (value is SexType sexType)
{
BsonSerializer.Serialize(context.Writer, sexType.Code);
}
else
{
throw new NotSupportedException($"This is not an {nameof(SexType)}");
}
}
}
根据以下重构代码进行以下更改:
public class SexTypeSerializer : SerializerBase<SexType>
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SexType sexType)
{
context.Writer.WriteString(sexType.Code);
}
public override SexType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var code = context.Reader.ReadString();
return SexType.FromCode(code);
}
}
在你的 Startup.cs 上这样使用它:
BsonSerializer.RegisterSerializer(new SexTypeSerializer());
我正在使用 MongoDB,我需要创建一个可以作为 提供程序 注入的序列化程序,而无需使用 class 装饰BsonSerializerAttribute.
我这样注册为提供商:
BsonSerializer.RegisterSerializer(typeof(SexType), new SexTypeSerializer());
我总是会遇到异常,因为 对象值 在此方法中始终为 null。
我该如何解决这个问题?
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
这是我实现的class。
public class SexTypeSerializer : IBsonSerializer<SexType>
{
public Type ValueType
{
get { return typeof(SexType); }
}
public SexTypeSerializer() { }
public SexType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var value = context.Reader.ReadString();
return SexType.FromCode(value);
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SexType value)
{
BsonSerializer.Serialize(context.Writer, value.Code);
}
object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
return SexType.FromCode(BsonSerializer.Deserialize<string>(context.Reader));
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
if (value is SexType sexType)
{
BsonSerializer.Serialize(context.Writer, sexType.Code);
}
else
{
throw new NotSupportedException($"This is not an {nameof(SexType)}");
}
}
}
根据以下重构代码进行以下更改:
public class SexTypeSerializer : SerializerBase<SexType>
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SexType sexType)
{
context.Writer.WriteString(sexType.Code);
}
public override SexType Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var code = context.Reader.ReadString();
return SexType.FromCode(code);
}
}
在你的 Startup.cs 上这样使用它:
BsonSerializer.RegisterSerializer(new SexTypeSerializer());