首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Json.Net (8.0)在Mono4.5Mac上创建StringEnumConverter时出错

Json.Net (8.0)在Mono4.5Mac上创建StringEnumConverter时出错
EN

Stack Overflow用户
提问于 2016-06-12 17:01:01
回答 5查看 3.1K关注 0票数 2

我很难理解我在Json.Net上遇到的问题。我试图像下面这样序列化/反序列化对象。

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

编辑1:删除JsonConverter(typeof(StringEnumConverter))装饰的避免了异常--然而,枚举再次被序列化为整数。

代码语言:javascript
复制
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,  

}

EN

回答 5

Stack Overflow用户

发布于 2017-06-15 11:17:52

我对mono也有同样的问题。

对我来说,一个简单的解决方法是创建一个从StringEnumConverter继承并使用它的类。

这样就避免了复制这个转换器的源代码(Json.net有很多"utils“类)。

在那之后就没有问题了。

票数 3
EN

Stack Overflow用户

发布于 2020-04-24 06:57:58

这是脱衣舞的问题。因为没有参数的构造函数从未在代码中显式使用,所以它将从构建中剥离。

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

有一个项目是Json.NET的一个分支,专门用于为Unity3D对其进行微调,其中包含一个完全修复:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-AotHelper的助手类。

在StringEnumConverter的情况下,您可以在代码中的任何地方添加这一行,它将解决这个问题:

代码语言:javascript
复制
AotHelper.EnsureType<StringEnumConverter>();
票数 2
EN

Stack Overflow用户

发布于 2017-01-27 21:58:47

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37776866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档