我有一个包含字段的类-Id,名称,公司和另外29个字段。
public class Employee
{
[XmlAttribute("textbox1")]
public int Id { get; set; }
[XmlAttribute("textbox11")]
public string Name { get; set; }
[XmlAttribute("textbox21")]
public string Company { get; set; }
[XmlAttribute("textbox22")]
public bool Val1 { get; set; }
[XmlAttribute("textbox23")]
public bool Val2 { get; set; }
public bool TestSomething{get;set;}
}
public class ParseData()
{
List<Employee> employee = new List<Employee>();
XmlSerialiser serializer = new XmlSerializer();
using(FileStream stream = new FileStream("test.xml", FileMode.Open))
{
employees = (Employee)serializer.Deserialize(stream);
}
//Todo: Add the new calculated value TestSomething
}
我正在反序列化xml数据(具有大约100名员工)中的值。
现在,我有一个新字段“ TestSomething”,该字段未进行反序列化,但将通过反序列化后的值显示,如下所示。有什么方法可以将计算出的值添加到现有的列表员工中吗?
foreach(var i in employees)
{
employee.TestSomething = (Val1 == true) ? Val1 : Val2;
}
任何对此的建议将不胜感激。
答案 0 :(得分:0)
下面的代码段是我用来序列化和反序列化xml字符串的扩展方法。请注意,这些必须放置在静态类中,并在该类中引用才能使用。
/// <summary>
/// Serializes the object to xml string.
/// </summary>
/// <returns>xml serialization.</returns>
public static string SerializeToXml<T>(this T instance)
where T : class, new()
{
string result;
var format = new XmlSerializer(typeof(T));
using (var strmr = new StringWriter())
{
format.Serialize(strmr, instance);
result = strmr.ToString();
}
return result;
}
/// <summary>
/// Deserializes xml serialized objects.
/// </summary>
/// <param name="xmlDocument">serialized string.</param>
/// <param name="result">out parameter.</param>
/// <returns>Instance object.</returns>
public static bool TryParseXml<T>(this string xmlDocument, out T result)
where T : class, new()
{
result = null;
if (string.IsNullOrWhiteSpace(xmlDocument))
{
return false;
}
try
{
using (TextReader str = new StringReader(xmlDocument))
{
var format = new XmlSerializer(typeof(T));
XmlReader xmlReader = XmlReader.Create(str);
if (format.CanDeserialize(xmlReader))
{
result = format.Deserialize(xmlReader) as T;
}
}
}
catch (InvalidOperationException)
{
return false;
}
return !(result is null);
}
在实践中,您将拥有某种类型的类,该类具有要存储到磁盘或数据库等中的属性。可以说我有一个类:
public class MyPoint
{
public double X { get; set;}
public double Y { get; set;}
}
如果我想存储MyPoint
的列表而又不费劲,我可以直接使用上面的SerializeToXml
方法来序列化该类。
var myPoints = new List<MyPoint>{new MyPoint{ X= 1, Y = 2}, new MyPoint{X = 3, Y = 4}};
var xmlString = myPoints.SerializeToXml();
一切都很好,花花公子,我的信息以xml格式保存在某个文件中。但是后来我的老板说:“老兄,对此感到抱歉,但是我们现在需要一个Z值,该值是使用Z = X * X + Y * Y
根据每个X和Y来计算的。”
将属性添加到序列化的类中不是问题(将属性取出是!!
序列化程序将尝试为不存在的属性分配值,并引发异常。。但是在这种情况下,我们不必担心。我去了原来的MyPoint
类,并添加了一个Z。
public class MyPoint
{
public double X { get; set;}
public double Y { get; set;}
public double Z { get; set;} // <---- Here
}
现在,当我解析xml时,将获得具有新属性的类。使用TryParseXml
,我得到了点列表。
// assume I have a string already from the xml document to use.
List<MyPoint> points = null;
if(serializedPoints.TryParse(out points))
{
foreach(var point in points)
{
point.Z = X * X + Y * Y;
}
}
var serializedPointsWithZ = points.SerializeToXml();
现在serializedPointsWithZ
只是一个可以写入文件等的字符串。