123 lines
4.7 KiB
C#
123 lines
4.7 KiB
C#
|
|
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 试验各类依赖属性
|
|||
|
|
/// <summary>
|
|||
|
|
/// 注册只读依赖属性
|
|||
|
|
/// </summary>
|
|||
|
|
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<T>(ObservableCollection<T> collection)
|
|||
|
|
{
|
|||
|
|
DataContractSerializer serializer = new DataContractSerializer(typeof(List<T>));
|
|||
|
|
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<T> Deserialize<T>(string xml)
|
|||
|
|
{
|
|||
|
|
DataContractSerializer serializer = new DataContractSerializer(typeof(List<T>));
|
|||
|
|
using (Stream ms = new MemoryStream())
|
|||
|
|
{
|
|||
|
|
using (StreamWriter writer = new StreamWriter(ms))
|
|||
|
|
{
|
|||
|
|
writer.Write(xml);
|
|||
|
|
writer.Flush();
|
|||
|
|
ms.Position = 0;
|
|||
|
|
List<T> list = (List<T>)serializer.ReadObject(ms);
|
|||
|
|
return new ObservableCollection<T>(list);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//使用XmlSerializer进行序列化。
|
|||
|
|
|
|||
|
|
public static string XSerialize<T>(ObservableCollection<T> collection)
|
|||
|
|
{
|
|||
|
|
XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
|
|||
|
|
using (StringWriter textWriter = new StringWriter())
|
|||
|
|
{
|
|||
|
|
serializer.Serialize(textWriter, collection.ToList());
|
|||
|
|
return textWriter.ToString();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static ObservableCollection<T> XDeserialize<T>(string xml)
|
|||
|
|
{
|
|||
|
|
XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
|
|||
|
|
using (StringReader textReader = new StringReader(xml))
|
|||
|
|
{
|
|||
|
|
List<T> list = (List<T>)serializer.Deserialize(textReader);
|
|||
|
|
return new ObservableCollection<T>(list);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//SplashScreen:启动屏幕
|
|||
|
|
//SecurityCriticalAttribute:代码安全特性
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
以上两种方法都是将ObservableCollection先转换为List,然后进行序列化,反序列化的时候,再将List转换回ObservableCollection。
|
|||
|
|
|
|||
|
|
需要注意的是,这两种方法都需要类型T是可序列化的,即类型T上面需要有[DataContract] 或者[XmlType]这样的Attribute。
|
|||
|
|
|
|||
|
|
另外,如果你的ObservableCollection中含有非基础类型,那么这些类型也需要是可序列化的,否则会抛出异常。
|
|||
|
|
|
|||
|
|
以上就是ObservableCollection的序列化方法,希望对你有所帮助。*/
|
|||
|
|
}
|
|||
|
|
}
|