Json.Net (8.0) 在 Mono 4.5 Mac 上创建 StringEnumConverter 时出错

问题描述 投票:0回答:5

我无法理解 Mac 上的 Json.Net 遇到的问题。 我正在尝试序列化/反序列化对象,如下所示。

代码在 Windows 上运行没有问题,但在 Mac 上生成 Newtonsoft.Json.JsonException“创建 StringEnumConverter 时出错”(也如图所示)。我希望有人确实看到代码或错误消息中的某些内容可以为我指明正确的方向。 该对象包含更多字段,但错误听起来像是与枚举有关。我正在 Xamarin 6 / Mono .Net 4.5 中构建,并且我正在使用 Json.Net 8.0.3 来实现 .Net 4.5。非常感谢任何帮助。

编辑1: 删除 JsonConverter(typeof(StringEnumConverter)) 装饰可以避免异常 - 但是,枚举会再次序列化为整数。

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace Lib
{
    [DataContract(IsReference = true)]
    public class Construction : LibraryComponent
    {
        public Construction() { }
        public override string ToString() { return Serialization.Serialize(this); }

        [DataMember]
        public string Construction { get; set; } = "defaultConstruction";

        ...

        [DataMember, JsonConverter(typeof(StringEnumConverter)), DefaultValue(InConvAlgo.TARP)]
        public InConvAlgo SurfaceConvectionModelInside { get; set; } = InConvAlgo.TARP;

        [DataMember, JsonConverter(typeof(StringEnumConverter)), DefaultValue(OutConvAlgo.DOE2)]
        public OutConvAlgo SurfaceConvectionModelOutside { get; set; } = OutConvAlgo.DOE2;

        ...

        [DataMember, DefaultValue(1)]
        public int Priority { get; set; } = 1;
    }

    public enum InConvAlgo { Simple, TARP, TrombeWall, AdaptiveConvectionAlgorithm };
    public enum OutConvAlgo { DOE2, TARP, MoWiTT, SimpleCombined, AdaptiveConvectionAlgorithm }; //  DOE-2,  

}

c# json macos mono json.net
5个回答
4
投票

StringEnumConverter 没有代码所需的自己的公共构造函数。 您可以使用 JsonStringEnumConverter 它提供公共构造函数。

替换:

[JsonConverter(typeof(StringEnumConverter))]  ====> [JsonConverter(typeof(JsonStringEnumConverter))]

它会起作用的。


3
投票

我对单声道也有同样的问题。

对我有用的一个简单解决方法是创建一个继承自 StringEnumConverter 的类并使用它。

这可以避免您复制此转换器的源代码(Json.net 有很多“utils”类)。

此后不再有问题。


3
投票

这是一个剥离问题。由于无参数构造函数从未在您的代码中显式使用,因此它会从您的构建中删除。

为了避免这种情况,您需要强制在构建中包含该构造函数。有多种方法可以做到这一点,其他答案中描述了其中的几种方法。我将添加另一个专门针对 Unity3D 的,我认为它更干净。

有一个项目是 Json.NET 的一个分支,专门用于针对 Unity3D 进行调整,其中包含一个帮助器类,可以准确修复该问题: https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-AotHelper

对于 StringEnumConverter,您可以在代码中的任何位置添加此行,它将解决问题:

AotHelper.EnsureType<StringEnumConverter>();

0
投票

我在 Json.Net 9.01 中使用 Unity3D(运行 Mono)实现了这一点。内部异常类似于“StringEnumConverter 没有无参数构造函数”。

我并不完全确定发生了什么,但我通过将 StringEnumConverter 复制到我自己的命名空间/程序集下的项目中来解决这个问题。


0
投票

我最近遇到了同样的问题。按照 Adi Unnithan 的建议,在我的源代码中包含

StringEnumConverter
需要您另外复制一些
Util
类。更不用说在复制的代码中更改该类的名称空间可能不符合许可证。不更改它会使其与任何其他引用的 json.net 版本发生争用。

我能找到的唯一解决方案是分叉 Json.net 并在 Mono 上构建,然后在主项目中引用生成的 dll。

© www.soinside.com 2019 - 2024. All rights reserved.