با سلام!
كسي از دوستان مي دونه چطوري ميشه هر collection رو تو فايل ذخيره و بازيابي كرد؟
با سلام!
كسي از دوستان مي دونه چطوري ميشه هر collection رو تو فايل ذخيره و بازيابي كرد؟
//Serialize
List<int> IDs=new List<int>(new int[10] {1,2,3,4,5,6,7,8,9,128});
XmlSerializer serializer = new XmlSerializer(typeof(List<int>));
using (FileStream fStream = File.Create("C:\\data.txt"))
{
serializer.Serialize(fStream, IDs);
fStream.Flush();
}
//Deserilize
using (FileStream fStream = File.Open("C:\\data.txt",FileMode.Open))
{
List<int> deserilizeObject= serializer.Deserialize(fStream) as List<int>;
}
هر collection را نمی توان در فایل ذخیره کرد، اجزای collection باید Serializable باشند، از متد SOAP Serialization برای serializa کردن اکثر تایپ ها می توان استفاده کرد و اکثر platform ها مثل Java یا .Net پشتیبانی خوبی از SOAP دارند. از Binary Serialization می توان برای Serialize کردن استفاده کرد که حلقه وسیع تری از اشیا را در بر می گیرد ولی platform های مختلف پشتیبانی مختلفی از آن دارند.
نهایتا برای ذخیره کردن اشیایی که Serializable نیستند باید متد Serialize کردن را خودتان برای کلاس بنویسید.
هر چند در 90 درصد موارد collection های .net کار ما رو راه میندازه ولی خوبه نمونه ای از custome collection را هم بهش نگاهی بندازیم .
[Serializable]
public class CustomeCollection :CollectionBase,
IXmlSerializable
{
//Indexer
public Item this[int index]
{
get { return List[index] as Item; }
}
public int Add(int id,string name)
{
return base.List.Add(new Item(id, name));
}
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
int Id = -1;
string name = string.Empty;
while (reader.Read())
{
if (reader.Name == "ID")
{
Id = Convert.ToInt32(reader.ReadInnerXml() );
reader.Read();
name = reader.Value;
Add(Id, name);
}
}
reader.Read();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
writer.WriteStartElement("Items");
foreach (Item key in base.List)
{
writer.WriteElementString("ID", key.ID.ToString());
writer.WriteElementString("Name", key.Name);
}
writer.WriteEndElement();
}
#endregion
}
public class Item
{
public Item(){}
public Item(int id,string name):this()
{
ID = id;
Name = name;
}
[XmlElement]
public int ID
{
get;
protected set;
}
[XmlElement]
public string Name
{
get;
protected set;
}
}