72
2726
9
社区元老
using System; using System.IO; using System.Xml; using System.Text; using System.Reflection; using System.Collections.Generic; using System.Xml.Serialization; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace TlsCad.Collections { [Serializable] public class SerialList : List { [NonSerialized] public Action ItemAdded; [NonSerialized] public Action ItemRemoving; public SerialList() : base() { } public SerialList(IEnumerable lst) : base(lst) { } public virtual void CopyFrom(IEnumerable lst) { base.AddRange(lst); if (ItemAdded != null) { foreach (T item in lst) { ItemAdded(item); } } } #region List public new virtual void Add(T item) { base.Add(item); if (ItemAdded != null) { ItemAdded(item); } } public new virtual void AddRange(IEnumerable items) { base.AddRange(items); if (ItemAdded != null) { foreach (T item in items) { ItemAdded(item); } } } public new virtual bool Remove(T item) { if (ItemRemoving != null && this.Contains(item)) { ItemRemoving(item); } return base.Remove(item); } public new virtual void RemoveRange(int index, int count) { if (ItemRemoving != null) { for (int i = index; i 0 && index ReadXml(string path) { if (File.Exists(path)) { using (XmlTextReader reader = new XmlTextReader(path)) { reader.Normalization = false; XmlSerializer xs = new XmlSerializer(GetType()); SerialList items = ((SerialList)xs.Deserialize(reader)); CopyFrom(items); return items; } } return null; } #endregion #region Bin class UBinder : SerializationBinder { public override Type BindToType(string assemblyName, string typeName) { try { return Type.GetType(typeName); } catch { return Assembly.Load(assemblyName).GetType(typeName); } } } public virtual void WriteTo(string path) { using (Stream stream = File.Open(path, FileMode.Create)) { BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, this); } } public virtual SerialList ReadFrom(string path) { if (File.Exists(path)) { using (Stream stream = File.Open(path, FileMode.Open)) { BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Binder = new UBinder(); SerialList lst = (SerialList)bformatter.Deserialize(stream); CopyFrom(lst);