首页 新闻 会员 周边 捐助

xamarin.form部署Release使用Newtonsoft.Json反序列化有问题

1
悬赏园豆:50 [已解决问题] 解决于 2019-02-13 22:27

神勇英明的大侠们,使用Xamarin.forms开发了一个比较复杂的app。
1、引用了NetStandard
2、调用后app接口使用的是NetStandard的HTTPClient
Debug部署一切ok,Release部署出现问题(所有项目都关闭了代码优化),描述如下:
1、调用后台http返回的json字符串反序列化有问题,貌似只序列化了第一层,使用的反序列化工具是Newtonsoft.Json 12.0.1;调用及反序列化封装在一个基础库,使用了泛型:
public async Task<XActionResult<GetCodeInfo>> GetVerifyCodeAsync()
{
return await HttpPost<GetCodeInfo>(SvcBaseAddress + "/GetVerifyCode", null);
}
protected async Task<XActionResult<T>> HttpPost<T>(string url, HttpContent content)
{
var rslt = new XActionResult<T>();
try
{
var setting = new JsonSerializerSettings()
{
MaxDepth=100
};
var res = await Client.PostAsync(url, content);
if (!res.IsSuccessStatusCode)
{
rslt.C = (int)CmnErrCode.HttpFailed;
rslt.D = "" + (int)res.StatusCode;
return rslt;
}
var r = await res.Content.ReadAsStringAsync();
rslt = JsonConvert.DeserializeObject<XActionResult<T>>(r, setting);
}
catch (Exception ex)
{
rslt.C = (int)CmnErrCode.Exception;
}
return rslt;
}
2、使用ViemModel绑定Image控件的Source属性显示图片,结果都不显示
<Image x:Name="imgVerifyCode" BackgroundColor="Blue" Source="{Binding Img}" WidthRequest="75" HeightRequest="35"></Image>

请大神么帮忙,求私下喝酒聊天吹牛B

ray.iot的主页 ray.iot | 初学一级 | 园豆:138
提问于:2019-01-20 20:34
< >
分享
最佳答案
0
public async Task<XActionResult<GetCodeInfo>> GetVerifyCodeAsync () {
    return await HttpPost<GetCodeInfo> (SvcBaseAddress + "/GetVerifyCode", null);
}
protected async Task<XActionResult<T>> HttpPost<T> (string url, HttpContent content) {
    var rslt = new XActionResult<T> ();
    try {
        var setting = new JsonSerializerSettings () {
            MaxDepth = 100
        };
        var res = await Client.PostAsync (url, content);
        if (!res.IsSuccessStatusCode) {
            rslt.C = (int) CmnErrCode.HttpFailed;
            rslt.D = "" + (int) res.StatusCode;
            return rslt;
        }
        var r = await res.Content.ReadAsStringAsync ();
        rslt = JsonConvert.DeserializeObject<XActionResult<T>> (r, setting);
    } catch (Exception ex) {
        rslt.C = (int) CmnErrCode.Exception;
    }
    return rslt;
}

没说清楚,Img就是rslt的值么?Debug时能拿到r的值么?提供出来,或拿出来单独测试,排除其他干扰。

收获园豆:50
楚人Leo | 小虾三级 |园豆:803 | 2019-01-21 00:20

感谢。Debug下一切正常。
var r = await res.Content.ReadAsStringAsync ();
rslt = JsonConvert.DeserializeObject<XActionResult<T>> (r, setting);
Release下这里反序列化就有问题,反序列化只给第一层数据赋值,第二层都是null

ray.iot | 园豆:138 (初学一级) | 2019-01-21 00:29

@ray.iot: 你得告诉我们r是什么,XActionResult长什么样我们才能分析。正常情况下Debug和Realse只是编译器的区别,只要我们代码规范,一般不会有问题。遇到这种情况,建议自查:

  1. 所有类成员在构造函数中都赋好初值,不要相信和依赖编译器的行为。
  2. 动态申请内存的变量,申请完内存之后马上赋初值。

另外你可以去https://github.com/JamesNK/Newtonsoft.Json上开一个Issue,请教项目组的成员,前提你得提供可复现的代码,建议把代码整理成一个Demo,提供给大家。

楚人Leo | 园豆:803 (小虾三级) | 2019-01-21 00:51

@楚人Leo: 非常感谢,我发你一份代码吧。我的qq:2482366007

ray.iot | 园豆:138 (初学一级) | 2019-01-21 11:48

@ray.iot: 已加

楚人Leo | 园豆:803 (小虾三级) | 2019-01-21 14:54
其他回答(2)
0

信息太少。
看看android那个日志信息。

花飘水流兮 | 园豆:13617 (专家六级) | 2019-01-22 17:27

找到了部分原因,项目属性里面不要勾选代码优化以及Multi-Dex,还有部分是vs原因,清理项目,重启电脑等等

支持(1) 反对(0) ray.iot | 园豆:138 (初学一级) | 2019-02-13 22:25
0

Xamarin.forms中序列化与反序列化.如果model没有标记DataContract和DataMember在release下会反序列化失败。在debug下没问题。好坑

Lexy | 园豆:202 (菜鸟二级) | 2019-05-18 11:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册