我传递了一个xml文档,其中缺少一些属性给开发者。我需要缺少的值在结果对象中为null,但是当前将反序列化为零,将bools设为false。XML将空属性反序列化为零并为false
下面的示例显示了一个文档,其中vals反序列化正确,但没有vals的文档返回零和空值。
如何强制反序列化器不处理这样的缺失属性。
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace SOQuestion
{
class Program
{
static void Main(string[] args)
{
var resultWithVals = getObject(docWithVals());
var resultWithoutVals = getObject(docWithoutVals());
Console.WriteLine("WITH VALS");
Console.WriteLine(resultWithVals.someBool);
Console.WriteLine(resultWithVals.someFloat);
Console.WriteLine(resultWithVals.someInt);
Console.WriteLine(resultWithVals.someString);
Console.WriteLine("WITHOUT VALS"); // nulls are returned here as zero and false
Console.WriteLine(resultWithoutVals.someBool);
Console.WriteLine(resultWithoutVals.someFloat);
Console.WriteLine(resultWithoutVals.someInt);
Console.WriteLine(resultWithoutVals.someString);
Console.ReadLine();
}
public static XmlDocument docWithVals()
{
var doc = new XmlDocument();
var el = (XmlElement)doc.AppendChild(doc.CreateElement("Result"));
el.SetAttribute("someString", "Hello World");
el.SetAttribute("someBool", "true");
el.SetAttribute("someInt", "1");
el.SetAttribute("someFloat", "1.1");
return doc;
}
public static XmlDocument docWithoutVals()
{
var doc = new XmlDocument();
var el = (XmlElement)doc.AppendChild(doc.CreateElement("Result"));
el.SetAttribute("someString", "Hello World");
return doc;
}
public static Result getObject(XmlDocument doc)
{
var mySerializer = new XmlSerializer(new Result().GetType());
var myStream = new MemoryStream();
doc.Save(myStream);
myStream.Position = 0;
var r = mySerializer.Deserialize(myStream);
return (Result)r;
}
}
[Serializable]
public class Result
{
[XmlAttribute]
public string someString { get; set; }
[XmlAttribute]
public bool someBool { get; set; }
[XmlAttribute]
public int someInt { get; set; }
[XmlAttribute]
public float someFloat { get; set; }
}
}
我看过那个。似乎没有任何工作可以对空属性进行反序列化。你能告诉我什么具体我正在寻找与我的例子有关。谢谢 – Jules
这个[XmlElementAttribute(IsNullable = false)]似乎在串行化到xml时不起作用,但不是从它反序列化。 – Jules
此属性在deserilising时不起作用。我试过[XmlAttribute,DefaultValue(null)],这也没有任何影响。 – Jules