:
.Net, , - () .., . , -, : , , (, ), .Net , , , . (, - XML), .
: ? , , , . , , , ( ) .
,.Net , de/serialization. -, System.SerializableAttribute(http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx). System.Runtime.Serialization.ISerializable(http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx), . , , - SerializationInfo, GetObjectData (...) (, "" ) . , , , .
. XML, System.Xml.Serialization.IXmlSerializable. , , ; ( ). , XML.Net; , - , ;).
:
LinkedList, "" . ; .
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Xml;
using System.IO;
namespace WFTest {
[Serializable]
class SerializableLinkedList<T>: LinkedList<T>, ISerializable, IXmlSerializable {
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("value", this.ToList());
}
SerializableLinkedList(SerializationInfo info, StreamingContext context)
: base((IEnumerable<T>)info.GetValue("value", typeof(List<T>))) { }
System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() { return null; }
void IXmlSerializable.ReadXml(XmlReader reader) {
this.Clear();
reader.ReadStartElement();
while (reader.LocalName=="item") {
T value;
if(reader.IsEmptyElement) {
value=default(T);
reader.ReadStartElement();
} else {
value=(T)((new XmlSerializer(typeof(T))).Deserialize(new StringReader(reader.ReadInnerXml())));
}
this.AddLast(value);
}
reader.ReadEndElement();
}
void IXmlSerializable.WriteXml(XmlWriter writer) {
foreach(T item in this) {
StringBuilder sb=new StringBuilder();
(new XmlSerializer(typeof(T))).Serialize(XmlWriter.Create(sb), item);
XmlDocument doc=new XmlDocument();
doc.LoadXml(sb.ToString());
writer.WriteStartElement("item");
writer.WriteRaw(doc.DocumentElement.OuterXml);
writer.WriteEndElement();
}
}
}
}
"" LinkedList ( , LinkedList), . , , , "T" , , .
, : , , , - (, , ). , .
, , StringBuilder ToString(): , + = String, ( ). , , .
,