链接所有时,JSON反序列化失败

3
我在设备上尝试反序列化JSON时遇到了ArgumentNullException。以下是确切的错误信息:

deserialize error

这里是调用代码:

private TMetadata ReadObject(string path)
{
    var data = File.ReadAllText(path);
    var obj = JsonConvert.DeserializeObject(data, _settings);
    return (TMetadata) obj;
}

我阅读了此线程,并意识到这是一个链接问题。我的项目在构建到设备时设置为Link All,由于大小限制,将其更改为Don't Link不可行。
我检查了json文本,并发现它正在尝试反序列化的类型,然后转到该类并将其标记为Preserve(AllMembers = true)。我还将相同的属性添加到任何在该类中使用的用户定义类中。但我仍然遇到了同样的错误。我还添加了--linkskip=AssemblyName到其他mtouch参数中,但没有成功。
有人有什么提示吗?至少有没有办法从Xamarin那里获取更多有用的信息?当异常发生时,它会带我到一个似乎随机的行 - 与该类无关的事件声明 - 并且单击堆栈中的方法没有任何作用。 我不知道“方法”参数是什么。
以下是从ReadObject调用之后开始的堆栈:
Newtonsoft.Json.Utilities.ValidationUtils.ArgumentNotNull(object value, string parameterName) in 
Newtonsoft.Json.Utilities.ExpressionReflectionDelegateFactory.CreateParametrizedConstructor(System.Reflection.MethodBase method) in 
Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(System.Collections.Generic.Dictionary<Bluebeam.Studio.Client.SDK.Sessions.SessionMarkupId,Bluebeam.Studio.Client.SDK.Sessions.ServerState.Pending.PendingItems.PendingMarkupDto> list) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewList(Newtonsoft.Json.JsonTextReader reader, Newtonsoft.Json.Serialization.JsonArrayContract contract, bool createdFromNonDefaultCreator) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(Newtonsoft.Json.JsonTextReader reader, System.MonoType objectType, Newtonsoft.Json.Serialization.JsonArrayContract contract, Newtonsoft.Json.Serialization.JsonProperty member, object existingValue, string id) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonTextReader reader, System.MonoType objectType, Newtonsoft.Json.Serialization.JsonArrayContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonObjectContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, object existingValue) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(Newtonsoft.Json.Serialization.JsonProperty property, Newtonsoft.Json.JsonConverter propertyConverter, Newtonsoft.Json.Serialization.JsonObjectContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerProperty, Newtonsoft.Json.JsonTextReader reader, Bluebeam.Studio.Client.SDK.Sessions.ServerState.Pending.PendingItems.PendingMarkupsData target) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Bluebeam.Studio.Client.SDK.Sessions.ServerState.Pending.PendingItems.PendingMarkupsData newObject, Newtonsoft.Json.JsonTextReader reader, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, string id) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Newtonsoft.Json.JsonTextReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, object existingValue) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonTextReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, object existingValue) in 
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.JsonTextReader reader, System.Type objectType, bool checkAdditionalContent) in 
Newtonsoft.Json.JsonSerializer.DeserializeInternal(Newtonsoft.Json.JsonTextReader reader, System.Type objectType) in 
Newtonsoft.Json.JsonSerializer.Deserialize(Newtonsoft.Json.JsonTextReader reader, System.Type objectType) in 
Newtonsoft.Json.JsonConvert.DeserializeObject(string value, System.Type type, Newtonsoft.Json.JsonSerializerSettings settings) in 
Newtonsoft.Json.JsonConvert.DeserializeObject(string value, Newtonsoft.Json.JsonSerializerSettings settings) in

2
“Link all”总是会带来很多麻烦,因为发布包的默认行为不是“Link all”,而是“Link SDK assemblies only”,这应该足以减小包的大小。如果将其设置为“Link SDK assemblies only”,它是否会抛出异常? - Gusman
当我将其设置为“仅链接SDK程序集”时,它可以正常工作,但会使应用程序大小增加额外的40MB,而我们真的不想这样做,因为我们正在努力将其缩小到100MB以下,以便可以通过蜂窝网络下载。 - Casey Hancock
3
仅使用link sdk,APK就增加了40MB?哇,这太多了,您可能正在使用许多外部库......我认为问题不在于您的类,而在于Json库。当连接时,它似乎会丢失一些功能,请尝试在链接器选项中添加“--linkskip=NameOfAssemblyToSkipWithoutFileExtension”,首先尝试使用json库,如果不起作用,请尝试使用您可能正在使用的其他库。 - Gusman
@CaseyHancock 如果你有多个自己的dll(使用共享项目或dll作为公共基础),值得尝试检查每个dll,如果找到不需要链接的dll,则可能会提示哪个类是有冲突的。 - Gusman
1
@Gusman "--linkskip=Newtonsoft.Json" 修复了它。谢谢! - Casey Hancock
显示剩余6条评论
1个回答

5
解决方案是在附加的mtouch参数中添加"--linkskip=Newtonsoft.Json"。感谢Gusman提供的建议!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接