我很难理解我在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))装饰的避免了异常--然而,枚举再次被序列化为整数。
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,
}

发布于 2017-06-15 11:17:52
我对mono也有同样的问题。
对我来说,一个简单的解决方法是创建一个从StringEnumConverter继承并使用它的类。
这样就避免了复制这个转换器的源代码(Json.net有很多"utils“类)。
在那之后就没有问题了。
发布于 2020-04-24 06:57:58
这是脱衣舞的问题。因为没有参数的构造函数从未在代码中显式使用,所以它将从构建中剥离。
为了避免这种情况,您需要强制在构建中包含该构造函数。有各种各样的方法可以做到这一点,其中有几个在其他的答案中描述。我将再一次专门针对Unity3D,我认为它更干净。
有一个项目是Json.NET的一个分支,专门用于为Unity3D对其进行微调,其中包含一个完全修复:https://github.com/jilleJr/Newtonsoft.Json-for-Unity/wiki/Fix-AOT-using-AotHelper的助手类。
在StringEnumConverter的情况下,您可以在代码中的任何地方添加这一行,它将解决这个问题:
AotHelper.EnsureType<StringEnumConverter>();发布于 2017-01-27 21:58:47
我在Json.Net 9.01中使用Unity3D (运行Mono)实现了这一点。内部异常类似于“StringEnum转换器没有无参数构造函数”。
我不完全确定发生了什么,但我在我自己的命名空间/程序集下将StringEnumConverter复制到我的项目中,从而解决了这个问题。
https://stackoverflow.com/questions/37776866
复制相似问题