using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Xml.Serialization;
namespace Future.Contract
{
    public class Readme : DependencyObject
    {
        #region 试验各类依赖属性
        /// 
        /// 注册只读依赖属性
        /// 
        public bool IsReadOnly
        {
            get { return (bool)GetValue(IsReadOnlyPropertyKey.DependencyProperty); }
            protected set { SetValue(IsReadOnlyPropertyKey, value); }
        }
        // Using a DependencyProperty as the backing store for IsReadOnly.  This enables animation, styling, binding, etc...
        public static readonly DependencyPropertyKey IsReadOnlyPropertyKey =
            DependencyProperty.RegisterReadOnly("IsReadOnly", typeof(bool), typeof(FutureInstruct), new PropertyMetadata(false));
        #endregion
        #region 参考资料
        /*
         * WPF气泡弹框
         * https://cloud.tencent.com/developer/article/2187533
         * WPF自定义窗体
         * https://m.jb51.net/program/2972553gk.htm
         * MEF框架使用
         * https://learn.microsoft.com/zh-cn/dotnet/framework/mef/
         * Db4o数据库详解
         * https://cloud.tencent.com/developer/article/2107051
         * C#文件压缩
         * https://m.jb51.net/program/317527fet.htm
         * WPF使用SVG格式矢量图
         * https://blog.csdn.net/u012563853/article/details/131056882
         * */
        #endregion
        //在WPF或者Silverlight中,ObservableCollection是一个集合,它可以用于绑定UI元素,当集合中的数据发生改变时,UI会自动更新。ObservableCollection实现了INotifyCollectionChanged接口,这使得当集合改变时,它可以通知UI进行更新。
        //然而,ObservableCollection本身不支持序列化。如果你需要序列化ObservableCollection,你需要自己实现一些逻辑。
        //以下是一种可能的方法:
        //使用DataContractSerializer进行序列化。
        public static string Serialize(ObservableCollection collection)
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(List));
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, collection.ToList());
                ms.Position = 0;
                using (StreamReader reader = new StreamReader(ms))
                {
                    return reader.ReadToEnd();
                }
            }
        }
        public static ObservableCollection Deserialize(string xml)
        {
            DataContractSerializer serializer = new DataContractSerializer(typeof(List));
            using (Stream ms = new MemoryStream())
            {
                using (StreamWriter writer = new StreamWriter(ms))
                {
                    writer.Write(xml);
                    writer.Flush();
                    ms.Position = 0;
                    List list = (List)serializer.ReadObject(ms);
                    return new ObservableCollection(list);
                }
            }
        }
        //使用XmlSerializer进行序列化。
        public static string XSerialize(ObservableCollection collection)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List));
            using (StringWriter textWriter = new StringWriter())
            {
                serializer.Serialize(textWriter, collection.ToList());
                return textWriter.ToString();
            }
        }
        public static ObservableCollection XDeserialize(string xml)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List));
            using (StringReader textReader = new StringReader(xml))
            {
                List list = (List)serializer.Deserialize(textReader);
                return new ObservableCollection(list);
            }
        }
        //SplashScreen:启动屏幕
        //SecurityCriticalAttribute:代码安全特性
        /*
        以上两种方法都是将ObservableCollection先转换为List,然后进行序列化,反序列化的时候,再将List转换回ObservableCollection。
        需要注意的是,这两种方法都需要类型T是可序列化的,即类型T上面需要有[DataContract] 或者[XmlType]这样的Attribute。
        另外,如果你的ObservableCollection中含有非基础类型,那么这些类型也需要是可序列化的,否则会抛出异常。
        以上就是ObservableCollection的序列化方法,希望对你有所帮助。*/
    }
}