Json.NET公共活动属性未序列化

时间:2016-05-10 08:32:53

标签: c# serialization json.net xamarin.android

我正在开发我的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 属性没有被序列化?和/或如何解决这个问题?

0 个答案:

没有答案