我正在研究我的Xamarin Android应用程序中的增强功能,以便更轻松地使用Android的保存状态 . 实现的一部分需要Json序列化具有自定义 [SaveState] 属性的当前 Activity 类的属性 . 所有其他属性都将被忽略 . 我有这个机制使用POCO(和Json.NET作为序列化器) . 使用自定义 [SaveState] 属性定义公共属性时,它会根据需要序列化(仅)该属性 .

当我定义一个扩展(显然)必需 Activity 类的类时,我们称之为 ExampleActivity ,它不再序列化公共属性 . 因此,在扩展 Activity 时,为POCO工作的相同设置不再起作用 .

另外:它没有序列化 ExampleActivity 或继承的 Activity 属性的任何内容 . 即使很多都是公开的 . 只是一个空的Json字符串对象 .

当我将 [JsonProperty] 属性添加到公共属性时,它会这样做!所以我相信它_t73701_ t序列化属性,它只是赢了't. For some reason it' s忽略它和其他一切 .

我似乎弄明白为什么它为序列化器增加了一个 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() 时,你会看到即使 ExampleActivityPropertyA 是一个普通的公共 property ,它也没有被序列化 . 而具有 [JsonProperty] 属性的 PropertyB 被序列化 .

对于我的解决方案,我不想将 [JsonProperty] 属性添加到也获得自定义 [SaveState] 属性的每个属性 . 它对 [SaveState] 行为的使用有影响 .

我希望我在描述我的问题时已经足够完整了 . 有谁知道为什么扩展 Activity 的类的常规公共属性没有被序列化?和/或如何解决这个问题?