C# 关于如何使用JSON.NET创建自定义GeoJson序列化程序的建议?

C# 关于如何使用JSON.NET创建自定义GeoJson序列化程序的建议?,c#,json.net,geojson,C#,Json.net,Geojson,我将尝试创建一个C#库来序列化对象以使用(用于序列化)和(用于几何体定义) 我考虑过两种不同的序列化实现方法,但不清楚哪种方法是最好的。它们是: 方法1-自定义属性 第一种方法涉及创建几个可应用于任何类的自定义属性,以修改序列化。例如,一个类可以这样装饰: [GeoJsonFeature] public class Building { [GeoJsonId] public Guid Id { get; set; } [GeoJsonProperty] public st

我将尝试创建一个C#库来序列化对象以使用(用于序列化)和(用于几何体定义)

我考虑过两种不同的序列化实现方法,但不清楚哪种方法是最好的。它们是:

方法1-自定义属性

第一种方法涉及创建几个可应用于任何类的自定义属性,以修改序列化。例如,一个类可以这样装饰:

[GeoJsonFeature]
public class Building
{
   [GeoJsonId]
   public Guid Id { get; set; }
   [GeoJsonProperty]
   public string Name { get; set; }
   [GeoJsonProperty]
   public int Floorcount { get; set; }
   [GeoJsonGeometry]
   public GeoAPI.Geometries.IGeometry Geometry { get; set; }
}
序列化对象将非常简单,如下所示:

JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.Data = building;
return jsonNetResult;
这种方法的优点是,任何业务对象都可以转换为GeoJSON对象,前提是它具有所需的属性(例如,几何体)。缺点是我需要创建许多自定义属性来支持序列化。此外,这会对业务对象产生“模糊”的影响

最后,我还没有确定这种方法在JSON.NET中是否可行,尽管看起来是可行的

方法2-定制JsonConverter

第二种方法涉及为各种类型创建自定义转换器。例如,我可能有一个GeoJsonConverter,当传递给给定类型的对象(比如Feature)时,就会创建GeoJSON对象。这可能看起来像:

public class GeoJsonFeatureConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer)
    {  
        // serializing code here 
    }

    public override void ReadJson(JsonReader reader, Type objectType, JsonSerializer serializer)
    {  
        // deserializing code here 
    }

    public override bool CanConvert(Type objectType)
    {
        return typeof(Feature).IsAssignableFrom(objectType);
    }
}
然后,我将能够序列化为GeoJson,如下所示:

JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.SerializerSettings.Converters.Add(new GeoJsonFeatureConverter());
jsonNetResult.Data = building;
这里的优点是,这似乎更容易创建。我已经通过一个非常简单的原型证明了这种方法是可行的。此外,如果我链接到,则已经定义了
功能

缺点是,我的业务对象在序列化之前需要映射到
功能。尽管如此,这可能被认为是一个优势,因为这可能会提供层之间的自然解耦。在这两种情况下,肯定会与GeoAPI紧密耦合,在后一种情况下与NetTopologySuite紧密耦合。我想我可以接受

我知道还有其他几个GeoJson序列化程序可用,例如,但是我希望采用与Json.NET API一致的方法,因为这是我们选择的序列化程序

你有没有看到一种方法比另一种更受欢迎的明显原因?也许还有另一种我不知道的方法


仅供参考,我倾向于第二种方法。看来这将更容易实施,而且总体上会更干净。我还碰巧喜欢域对象和它将创建的GeoJson对象之间的自然边界。

我个人倾向于第一选择,原因很简单。如果您查看.NET framework,则System.Xml.serialization命名空间中存在类似于序列化的内容。在那里,他们几乎完全按照您在第一种方法中的建议执行

但是,如果您不特别喜欢,我建议使用第三种方法:编写自定义序列化格式化程序,实现System.Runtime.serialization.IFormatter。这使您能够为对象使用标准序列化符号和机制(如[Serializable]和ISerializable),但您遵循的是公认的模式,使用起来很容易识别。另外,通过交换IFormatter实现,您还可以轻松支持其他形式的序列化(二进制、soap和其他自定义格式)

编辑:以下是一个示例: