使用适用于 MonoAndroid10 的 AWS SDK 的 LitJson 序列化产生的额外垃圾

Extra garbage produced by LitJson serialization with AWS SDK for MonoAndroid10

当我在 windows 控制台应用程序中 运行 引用 AWSSDK.Core.3.3.19.1\lib\net45\AWSSDK.Core.dll 的以下代码时,我变得很好输出:

public class Person
{
   public string Name { get; set; }
   public int Age { get; set; }
   public DateTime Birthday { get; set; }
}

public static void PersonToJson()
{
   Person bill = new Person();

   bill.Name = "William Shakespeare";
   bill.Age = 51;
   bill.Birthday = new DateTime(1564, 4, 26);

   string json_bill = JsonMapper.ToJson(bill);

   Console.WriteLine(json_bill);
}

输出(添加格式)为:

{  
   "Name":"William Shakespeare",
   "Age":51,
   "Birthday":"04/26/1564 00:00:00"
}

但是当我 运行 相同的代码引用 AWSSDK.Core.3.3.19.1\lib\MonoAndroid10\AWSSDK.Core.dll 时,我得到不同的结果:

编辑 原来的 post 这里有不同的代码,但我能够用相同的代码重现问题。

备用版本如下所示:

{  
   "Name":"William Shakespeare",
   "Age":51,
   "Birthday":"04/26/1564 00:00:00",
   "<Name>k__BackingField":"William Shakespeare",
   "<Age>k__BackingField":51,
   "<Birthday>k__BackingField":"04/26/1564 00:00:00"
}

这是一个错误吗?我可以解决它并清理它吗?我假设我需要使用 Android 版本才能在 Android 设备上 运行,但有趣的是,我 可以 引用 Mono[=来自 Windows 控制台应用程序的 35=]10 版本。 .NET跨平台,为什么不同平台会有不同的文件?

您的 Outpot 代码完全不同。它必须处理数组。面对这种情况,它有两个选择:

  • 只显示.ToString() 的结果。在 .NET 中通常是 class姓名
  • 以原始程序员想要的任何详细级别转储数组内容

像这样输出数组只对调试有用。所以已经让你正确的输出代码。

至于生日:显示的是存储在 DateTIme 中的原始值,未使用系统选择的格式重新解释。它可能类似于 "the ticks/seconds since counting started"。老实说,我很惊讶 DateTime 甚至可以显示该值。

Is this a bug? Can I work around it and clean this up? I assume I need to use the Android version in order to run on an Android device, but interestingly, I can reference the MonoAndroid10 version from a Windows console application. Why are there different files for different platforms when .NET is cross-platform?

我已经测试了最新的 AWSSDK.Core (3.3.21.6),这个问题仍然存在。

然后我还用最新版本(0.11.0)分别测试了LitJson。没有这个问题。

所以问题似乎只存在于 AWSSDK.Core 中。在框架作者解决问题之前,您的问题的解决方法是单独引用 LitJson 并使用 LitJson.JsonMapper 而不是 ThirdParty.Json.LitJson.JsonMapper.