将位置坐标的 Mongo BSON 数组反序列化为自定义 C# 类

Posted

技术标签:

【中文标题】将位置坐标的 Mongo BSON 数组反序列化为自定义 C# 类【英文标题】:Deserialize Mongo BSON array of location coordinates to custom C# class 【发布时间】:2016-02-11 08:16:05 【问题描述】:

我有一个存储在 Mongo 中的文档,格式如下:

"address" : 
    "building" : "469",
    "coord" : [ 
        -73.961704, 
        40.662942
    ],
    "street" : "Flatbush Avenue",
    "zipcode" : "11225"

我正在使用官方的 C# Mongo 驱动程序与 MongoDB 实例进行通信。我已经定义了以下 POCO 类来对应文档:

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 数组值反序列化到我创建的 Coordinate 类中。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要创建一个自定义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 BSON 数组反序列化为自定义 C# 类的主要内容,如果未能解决你的问题,请参考以下文章

无法将 JSON 数组反序列化为 C# 对象 [关闭]

无法将 JSON 数组反序列化为类型 - Json.NET

C#将不同类型的xml数组反序列化为多个数组

如何将具有固定模式的值数组反序列化为强类型数据类?

如何将对象的json数组反序列化为字典[重复]

如何使用 kotlinx 序列化将值数组反序列化为集合