我正在开发我的Xamarin Android应用程序的增强功能,以便更轻松地使用Android的保存状态。实现的一部分需要Json序列化具有自定义Activity
属性的当前[SaveState]
类的属性。所有其他属性都将被忽略。我有这个机制使用POCO(和Json.NET作为序列化器)。使用自定义[SaveState]
属性定义 public 属性时,它会根据需要序列化(仅)该属性。
当我定义一个扩展(显然)必需Activity
类的类时,我们称之为ExampleActivity
,它不再序列化 public 属性。因此,在扩展Activity
时,用于POCO的相同设置不再有效。
此外:它没有序列化ExampleActivity
或继承的Activity
属性的任何内容。即使很多人公开。只是一个空的Json字符串对象。
当我将[JsonProperty]
属性添加到 public 属性时,它会这样做!所以我认为这不是Json.NET无法序列化属性的问题,它不会。出于某种原因,它忽略了它和其他一切。
我尝试了一些东西,但我似乎无法弄清楚为什么忽略这些属性。我已经为序列化程序添加了一个TraceWriter
,希望能看到一些可能指向正确方向的东西,但事实并非如此。
我添加了一个小的剥离代码段,可以重现这个问题:
public static class Example
{
public static void Run()
{
var exampleActivity = new ExampleActivity { PropertyA = "A value", PropertyB = "B value" };
// Default serializer settings with a memory trace writer
var serializerSettings = new JsonSerializerSettings { TraceWriter = new MemoryTraceWriter() };
var serializedString = JsonConvert.SerializeObject(exampleActivity, serializerSettings);
System.Diagnostics.Debug.WriteLine(serializerSettings.TraceWriter);
// NOTE: The serialized string only contains PropertyB
System.Diagnostics.Debug.WriteLine($"SerializedString: {serializedString}");
}
public class ExampleActivity : Activity
{
//[JsonProperty]
public string PropertyA { get; set; }
[JsonProperty]
public string PropertyB { get; set; }
}
}
调用静态Example.Run()
时,您会看到即使ExampleActivity
的{{1}}是常规公共属性,它也不会被序列化。而具有PropertyA
属性的PropertyB
被序列化。
对于我的解决方案,我不希望将[JsonProperty]
属性添加到也获得自定义[JsonProperty]
属性的每个属性。它目前正在幕后使用Json(de)序列化来实现所需的行为,不应该影响[SaveState]
行为的使用。
我希望我在描述我的问题时已经足够完整了。有谁知道为什么扩展[SaveState]
的类的常规 public 属性没有被序列化?和/或如何解决这个问题?