从Json的ReactiveObject继承的反序列化对象不起作用

时间:2018-07-03 19:46:54

标签: c# json.net reactiveui

我正在尝试将一些json反序列化为一些继承自Reactive UI的ReactiveObject类的简单对象。由于某些原因,这些属性将永远不会在那里填充。相反,使用POCO可以毫无问题。

class Program
{
    class Profile
    {
        public string Name { get; set; }
    }

    class ReactiveProfile : ReactiveObject
    {
        private string _name;

        public string Name
        {
            get => _name;
            set => this.RaiseAndSetIfChanged(ref _name, value);
        }
    }

    static void Main(string[] args)
    {
        var profiles = new List<Profile>()
        {
            new Profile() {Name = "Foo"},
            new Profile() {Name = "Bar"}
        };

        var path = @"C:\temp\profiles.json";

        File.WriteAllText(path,
            JsonConvert.SerializeObject(profiles.ToArray(),
                Formatting.Indented,
                new StringEnumConverter()),
            Encoding.UTF8);

        // works
        var pocoProfiles = (Profile[])JsonConvert.DeserializeObject(
            File.ReadAllText(path, Encoding.UTF8),
            typeof(Profile[]));

        // properties not filled
        var reactiveProfiles = (ReactiveProfile[])JsonConvert.DeserializeObject(
            File.ReadAllText(path, Encoding.UTF8),
            typeof(ReactiveProfile[]));

        if (File.Exists(path))
        {
            File.Delete(path);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

要正确地序列化ReactiveObjects,应使用System.Runtime.Serialization命名空间的 DataContract 属性。然后,使用 DataMember 属性标记您要保存的成员,并使用 IgnoreDataMember 属性标记您不想保存的成员。

因此,您的情况如下:

[DataContract]
class ReactiveProfile : ReactiveObject
{
    [IgnoreDataMember]
    private string _name;

    [DataMember]
    public string Name
    {
        get => _name;
        set => this.RaiseAndSetIfChanged(ref _name, value);
    }
}

这是Paul在Github上的旧用法之一:link

还有一个用于数据持久性的文档链接:link

我运行了您为此更改提供的代码,该代码可以正常运行。如果您有任何问题,请告诉我。