gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:15:14 30 4
gpt4 key购买 nike

我将尝试创建一个 C# 库来将对象序列化为 GeoJSON使用 Json.NET (用于序列化)和 GeoAPI.NET (用于几何定义)。

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

方法 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 对象,前提是它具有所需的属性(例如 Geometry )。缺点是我需要创建一些自定义属性来支持序列化。此外,这会“混淆”业务对象。

最后,我还不确定这种方法是否适用于 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;

这里的优点是这看起来更容易创建。我已经通过一个非常简单的原型(prototype)证明了这种方法是可行的。此外,如果我链接到 NetTopologySuite,则已经定义了 Feature 类.

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

我知道其他几个可用的 GeoJson 序列化程序,例如 GeoJson.NET但是我想要一种与 Json.NET API 一致的方法,因为这是我们选择的序列化程序。

您是否看到任何明显的原因可以说明为什么一种方法优于另一种方法?也许还有另一种我不知道的方法?

仅供引用,我倾向于第二种方法。看起来它会更容易实现,并且整体上会更干净。我也碰巧喜欢它会创建的域对象和 GeoJson 对象之间的自然边界。

最佳答案

我个人倾向于第一个选择,原因很简单。如果您查看 .NET 框架,就会发现在 System.Xml.Serialization 命名空间中有一个与您的序列化类似的东西。他们几乎完全按照您在第一种方法中的建议进行操作。

但是,如果您不是特别喜欢那样,我建议使用第三种方法:编写自定义序列化格式化程序,实现 System.Runtime.Serialization.IFormatter。这使您能够为您的对象(如 [Serializable] 和 ISerializable)使用标准序列化符号和机制,但您遵循公认的模式,使 use 易于识别。此外,作为额外的好处,您可以通过换掉 IFormatter 实现轻松地支持其他形式的序列化(二进制、肥皂、其他自定义格式)

编辑:这是一个例子:Link

关于c# - 有关如何使用 JSON.NET 创建自定义 GeoJson 序列化程序的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262380/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com