将 Mongo 位置坐标的 BSON 数组反序列化为自定义 C# class
Deserialize Mongo BSON array of location coordinates to custom C# class
我有一份文件存储在 Mongo 中,格式如下:
"address" : {
"building" : "469",
"coord" : [
-73.961704,
40.662942
],
"street" : "Flatbush Avenue",
"zipcode" : "11225"
}
我正在使用官方 C# Mongo 驱动程序与 MongoDB 实例进行通信。我定义了如下POCOclasses来对应文档:
public class Coordinate
{
public float Lat { get; set; }
public float Long { get; set; }
}
public class Address
{
[BsonElement("street")]
public string Street { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
[BsonElement("building")]
public string Building { get; set; }
[BsonElement("coord")]
public Coordinate Coord { get; set; }
}
但我不确定在序列化属性方面必须做什么,以便将坐标 BSON 数组值反序列化为我创建的坐标 class。
有什么想法吗?
您需要创建自定义 serializer:
public class MyCustomArraySerializer : SerializerBase<Coordinate>
{
public override Coordinate Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
context.Reader.ReadStartArray();
var lat=context.Reader.ReadDouble();
var lon = context.Reader.ReadDouble();
context.Reader.ReadEndArray();
return new Coordinate() { Long = (float)lon, Lat = (float)lat };
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Coordinate value)
{
context.Writer.WriteStartArray();
context.Writer.WriteDouble(value.Lat);
context.Writer.WriteDouble(value.Long);
context.Writer.WriteEndArray();
}
}
然后在Coord
上添加这个属性 属性:
public class Address
{
//...
//Add this attribute
[BsonSerializer(typeof(MyCustomArraySerializer))]
public Coordinate Coord { get; set; }
}
我有一份文件存储在 Mongo 中,格式如下:
"address" : {
"building" : "469",
"coord" : [
-73.961704,
40.662942
],
"street" : "Flatbush Avenue",
"zipcode" : "11225"
}
我正在使用官方 C# Mongo 驱动程序与 MongoDB 实例进行通信。我定义了如下POCOclasses来对应文档:
public class Coordinate
{
public float Lat { get; set; }
public float Long { get; set; }
}
public class Address
{
[BsonElement("street")]
public string Street { get; set; }
[BsonElement("zipcode")]
public string ZipCode { get; set; }
[BsonElement("building")]
public string Building { get; set; }
[BsonElement("coord")]
public Coordinate Coord { get; set; }
}
但我不确定在序列化属性方面必须做什么,以便将坐标 BSON 数组值反序列化为我创建的坐标 class。
有什么想法吗?
您需要创建自定义 serializer:
public class MyCustomArraySerializer : SerializerBase<Coordinate>
{
public override Coordinate Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
context.Reader.ReadStartArray();
var lat=context.Reader.ReadDouble();
var lon = context.Reader.ReadDouble();
context.Reader.ReadEndArray();
return new Coordinate() { Long = (float)lon, Lat = (float)lat };
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Coordinate value)
{
context.Writer.WriteStartArray();
context.Writer.WriteDouble(value.Lat);
context.Writer.WriteDouble(value.Long);
context.Writer.WriteEndArray();
}
}
然后在Coord
上添加这个属性 属性:
public class Address
{
//...
//Add this attribute
[BsonSerializer(typeof(MyCustomArraySerializer))]
public Coordinate Coord { get; set; }
}