简而言之:
我有一个名为Categories的项目列表。对于列表类别中的每个项目,我都有一个xml文件:
System.IO.File.Create(Categories[listPicker.SelectedIndex] + ".xml");
将创建的项目序列化为带有所选索引名称的xml文件。
问题:
问题在于,对于类别中的每个项目,需要将xml文件反序列化为列表,因为类别的每个对象必须是另一个列表,因为它还包含项目。
但是没有用于反序列化xml文件的列表:
反序列化:
Serialize.Deserialize(Variable list name , Categories[1]+".xml");
那么我如何动态创建列表,或者你能为这个问题提供更好的解决方案吗?
答案 0 :(得分:0)
即使每个列表具有不同的名称,内容的结构也是相同的。文字/描述和价值。
我会为Item创建一个类。像
这样的东西public class ComboItem{
public string Value {get; set;}
public string Text {get; set;}
}
然后我将为每个XML文件具有的ComboItem列表创建另一个类
public class ComboItemList
{
public ComboItemList()
{
ComboItems = new List<ComboItem>();
}
[XmlArray("ComboItems"), XmlArrayItem("ComboItem")]
public List<ComboItem> ComboItems { get; set; }
}
我有一个Serialize / Deserialize Helper。像
这样的东西 #region static T DeserializeObject( string xml, Encoding encoding )
/// <summary>
/// Deserialize an Xml String to an [object]
/// </summary>
/// <typeparam name="T">Object Type to Deserialize</typeparam>
/// <param name="xml">Xml String to Deserialize</param>
/// <param name="encoding">System.Text.Encoding Type</param>
/// <returns>Default if Exception, Deserialize object if successful</returns>
/// <example>
/// // UTF-16 Deserialize
/// [object] = SerializationHelper<ObjectType>DeserializeObject( xml, Encoding.Unicode )
/// </example>
/// <example>
/// // UTF-8 Deserialize
/// [object] = SerializationHelper<ObjectType>DeserializeObject( xml, Encoding.UTF8 )
/// </example>
public static T DeserializeObject(string xml, Encoding encoding)
{
if (string.IsNullOrEmpty(xml)) { return default(T); }
try
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(xml)))
{
// No settings need modifying here
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
using (XmlReader xmlReader = XmlReader.Create(memoryStream, xmlReaderSettings))
{
return (T)xmlSerializer.Deserialize(xmlReader);
}
}
}
catch
{
return default(T);
}
}
#endregion
/// <summary>
/// Deserialize an Xml String to an [object] with UTF8 as Encoding
/// </summary>
/// <param name="xml">Xml String to Deserialize</param>
/// <returns>Default if Exception, Deserialize object if successful</returns>
/// <example>
/// [object] = SerializationHelper<ObjectType>DeserializeObject( xml )
/// </example>
public static T DeserializeObjectFromFile(string filePath)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException(string.Format("The file {0}, don't exist.", filePath));
}
StreamReader sr = File.OpenText(filePath);
string xml = sr.ReadToEnd();
return DeserializeObject(xml, Encoding.UTF8);
}
我会像这样打电话
string filePath01 = "PATH TO FILE 01";
List<ComboItem> List01 = SerializationHelper<ComboItem>.DeserializeObjectFromFile(filePath01);
string filePath02 = "PATH TO FILE 02";
List<ComboItem> List02 = SerializationHelper<ComboItem>.DeserializeObjectFromFile(filePath02);
List01和List02将具有File01和File02的内容。对你拥有的每个文件重复一遍。
使用更好的体系结构,您可以在基类中创建一些属性,可以是单例,并且只加载每个文件,只增加一次,从而提高性能。