我有一个包含字段的类-ID,名称,公司和另外29个字段。我从xml(大约有100行)中获取值。我正在使用xmldeserialiser反序列化。现在,我有一个新字段,必须根据序列化后获得的值进行计算。有什么方法可以将它们添加到现有列表中吗?
尝试使用foreach循环进行迭代并添加到列表中。它没有设置值。
对此有任何建议,将不胜感激。
下面的代码段是我用来序列化和反序列化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
只是可以写入文件等的字符串。