如何将ObservableCollection派生类与JSON序列化?

时间:2016-08-22 07:31:39

标签: c# json xamarin.android

对于.NET。我尝试了很多不同的东西,但似乎没有任何效果。要求:

  1. ObservableCollection的T< T>是一个ISerializable
  2. ObservableCollection派生类理想情况下也是ISerializable
  3. 对于此上下文,作为ISerializable =仅使用ISerializable技术进行序列化,而不是反射属性
  4. 环境是适用于Android的Xamarin,我更喜欢使用JSON.NET或DataContractJsonSerializer。示例使用Newtonsoft 9.0.1

    使用这样的代码:

    [Serializable]
    [KnownType(typeof(ObservableCollectionSerializable.Item))]
    public class ObservableCollectionSerializable : 
        ObservableCollection<ObservableCollectionSerializable.Item>
    {
        [Serializable]
        public class Item : ISerializable
        {
            readonly string value;
    
            public Item(string value) { this.value = value; }
    
            public Item(SerializationInfo info, StreamingContext context)
            {
                value = info.GetString("value");
            }
    
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.AddValue("value", value);
            }
        }
    }
    

    像这样调用:

                var _item = new Test.ObservableCollectionSerializable.Item("test1");
                var c = new Test.ObservableCollectionSerializable();
    
                c.Add(_item);
    
                var serializer = new Newtonsoft.Json.JsonSerializer();
                serializer.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver()
                {
                    //IgnoreSerializableInterface = false // not available
                };
                var stringWriter = new StringWriter();
    
                serializer.Serialize(stringWriter, c);
    
                var json = stringWriter.ToString();                
    
                var stringReader = new StringReader(json);
    
                var c2 = (Test.ObservableCollectionSerializable)
                    serializer.Deserialize(stringReader, typeof(Test.ObservableCollectionSerializable));
    
                var item = c2[0];
    

    结果是:

    • &#34; JSON&#34;变量总是结束&#34; [{}]&#34; - 空
    • 永远不会调用基于ISerialize的方法
    • serializer.Deserialize call总是抛出异常&#34; Newtonsoft.Json.JsonSerializationException:无法找到用于类型Notos.App.UI.Android.Test.ObservableCollectionSerializable + Item的构造函数。一个类应该有一个默认的构造函数,一个带参数的构造函数或一个用JsonConstructor属性标记的构造函数。路径&#39; [0]&#39;,第1行,第3和第34行

0 个答案:

没有答案