2016-06-12 67 views
1

我无法理解我在Mac上使用Json.Net时遇到的问题。 我想序列化/反序列化下面的对象。Json.Net(8.0)在Mono 4.5 Mac上创建StringEnumConverter时出错

该代码在Windows上运行时没有问题,但在Mac上生成Newtonsoft.Json.JsonException“Error creating 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, 

} 

enter image description here

回答

0

我用Unity3D(运行单声道)打这Json.Net 9.01。内部异常就像'StringEnumConverter'没有无参数构造函数'。

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

0

我最近遇到了同样的问题。按照Adi Unnithan的建议,在我的源代码中包含StringEnumConverter,要求您额外复制一些Util类。更不用说,在复制的代码中更改该类的名称空间,可能不会与许可证混在一起。不改变它与json.net的任何其他引用版本的争用。

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

3

我对mono有同样的问题。

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

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

之后没有更多的问题。