json 在Mono 4.5 Mac上创建StringEnumConverter时出错

jogvjijk  于 4个月前  发布在  Mac
关注(0)|答案(5)|浏览(67)

我很难理解我在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,  

}

字符串
x1c 0d1x的数据

eivnm1vs

eivnm1vs1#

StringEnumConverter没有自己的公共构造函数,这是代码所需要的。你可以使用JsonStringEnumConverter,它提供了公共构造函数。
替换:[JsonConverter(typeof(StringEnumConverter))] ====> [JsonConverter(typeof(JsonStringEnumConverter))]
它会起作用的。

k75qkfdt

k75qkfdt2#

我也有同样的问题。
一个简单的解决方法是创建一个继承StringEnumConverter的类并使用它。
这避免了你复制这个转换器的源代码(Json.net有很多“utils”类)。
之后就没有问题了。

jslywgbw

jslywgbw3#

这是一个剥离问题。因为无参数构造函数从未在代码中显式使用,所以它会从构建中剥离。
为了避免它,你需要在构建中强制包含该构造函数。有一系列方法可以做到这一点,其中一些在其他答案中有描述。我将添加另一个特定于Unity3D的方法,我认为它更清晰。
有一个项目是Json.NET的一个分支,致力于为Unity3D调整它,它包含一个帮助类,可以完全解决这个问题:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-AotHelper
在StringEnumConverter的情况下,你可以在代码中的任何地方添加这一行,它将解决这个问题:

AotHelper.EnsureType<StringEnumConverter>();

字符串

zujrkrfu

zujrkrfu4#

我在Json.Net 9.01中使用Unity3D(运行Mono)遇到了这个问题。内部异常类似于“No parameterless constructor for StringEnumConverter”。
我不完全确定发生了什么,但我通过将StringEnumConverter复制到我自己的命名空间/程序集下的项目中来解决这个问题。

zvokhttg

zvokhttg5#

我最近遇到了同样的问题。在我的源代码中包含StringEnumConverter,正如Adi Unnithan所建议的那样,需要你额外复制一些Util类。更不用说在复制的代码中更改该类的命名空间,可能与许可证不一致。不更改它会使它与任何其他引用的json.net版本发生冲突。
我能找到的唯一解决方案是fork Json.net并在Mono上构建,然后在主项目中引用生成的dll。

相关问题