Ant*_*ton 1 json xamarin.android servicestack
我正在尝试在MonoDroid项目中使用ServiceStack进行Json序列化/反序列化.
我已经构建了ServiceStack以在MonoDroid环境中运行它,但现在我遇到了JSON反序列化的问题.
示例代码:
public class Track
{
public string Id { get; set; }
public string Title { get; set; }
public string Artist { get; set; }
public string Hash { get; set; }
public string Type { get; set; }
}
}
...
var track = new Track { Id = "1", Artist = "artist name", Hash = "654874", Title = "song title", Type = "mp3", };
var json = ServiceStack.Text.JsonSerializer.SerializeToString(track);
var track1 = ServiceStack.Text.JsonSerializer.DeserializeFromString<Track>(json);
Run Code Online (Sandbox Code Playgroud)
在反序列化时,我有一个例外:未处理的异常:
System.ArgumentNullException: Argument cannot be null.
Parameter name: method
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
[External Code]
0x5E in ServiceStack.Text.Json.JsonReader.GetParseFn at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\Json\JsonReader.Generic.cs:36 C#
0x2 in ServiceStack.Text.Json.JsonTypeSerializer.GetParseFn at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\Json\JsonTypeSerializer.cs:283 C#
0xF in ServiceStack.Text.Common.TypeAccessor.Create at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\Common\DeserializeType.cs:146 C#
0x142 in ServiceStack.Text.Common.DeserializeType`1[[ServiceStack.Text.Json.JsonTypeSerializer, ServiceStack.Text, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].GetParseMethod at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\Common\DeserializeType.cs:60 C#
0x43A in ServiceStack.Text.Common.JsReader`1[[ServiceStack.Text.Json.JsonTypeSerializer, ServiceStack.Text, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].GetParseFn at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\Common\JsReader.cs:100 C#
0x6 in ServiceStack.Text.Json.JsonReader`1[[Database.Models.Track, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..cctor at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\Json\JsonReader.Generic.cs:58 C#
0x1B in ServiceStack.Text.JsonSerializer.DeserializeFromString at [...]\Android\ServiceStack.Text\src\ServiceStack.Text\JsonSerializer.cs:33 C#
Run Code Online (Sandbox Code Playgroud)
我看到有:
var genericType = typeof(JsonReader<>).MakeGenericType(type);
var mi = genericType.GetMethod("GetParseFn", BindingFlags.Public | BindingFlags.Static);
parseFactoryFn = (ParseFactoryDelegate)Delegate.CreateDelegate(typeof(ParseFactoryDelegate), mi);
Run Code Online (Sandbox Code Playgroud)
genericType是"ServiceStack.Text.Json.JsonReader`1 [System.String]"类型是"System.String"
所以,"mi"变量为null
有任何想法如何解决它,或在哪里看?
谢谢.
这里的问题是你在构建配置中启用了链接,并且该GetParseFn()方法被链接掉了,因为它没有被明确引用.
链接器是一个静态分析工具,作为Mono for Android构建过程的一部分.它将扫描您编译的应用程序,并实际删除未明确引用的任何.NET(或在本例中,您编译的ServiceStack类库).这对于减少应用程序的大小有很大帮助,但是您可能遇到问题,如此处所示.由于该GetParseFn()方法从未被显式引用(它通过反射调用),因此链接器不知道它是否需要并将其链接起来.
有几种方法可以解决这个问题.
PreserveAttribute:使用此属性,您可以告诉链接器保留您知道所需的某些部分,即使它们未被明确引用.由于ServiceStack是一个外部库而不是您自己的库,因此在这种情况下,这可能不是最佳解决方案.就个人而言,在你的情况下,我建议你去Linkskip路线.它将允许您仍然获得链接器的所有好处,但让它忽略ServiceStack以避免这样的问题.在您的项目文件中,您最终会得到以下内容:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<AndroidLinkMode>Full</AndroidLinkMode>
<AndroidLinkSkip>ServiceStack.Text</AndroidLinkSkip>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
701 次 |
| 最近记录: |