C# 将XmlElement反序列化为自定义对象
我有一些需要反序列化为对象的XML。大多数元素都可以转换为字符串和整数,但有一个元素作为数字输入,我需要将其转换为三个布尔值。这就是转换为布尔值的逻辑:C# 将XmlElement反序列化为自定义对象,c#,xml-serialization,C#,Xml Serialization,我有一些需要反序列化为对象的XML。大多数元素都可以转换为字符串和整数,但有一个元素作为数字输入,我需要将其转换为三个布尔值。这就是转换为布尔值的逻辑: switch (_valFromXML) { case 0: _bool1= true; break; case 1: _bool2= true; bre
switch (_valFromXML)
{
case 0:
_bool1= true;
break;
case 1:
_bool2= true;
break;
case 2:
_bool1= true;
_bool2= true;
break;
case 3:
_bool3= true;
break;
case 4:
_bool1= true;
_bool3= true;
break;
case 5:
_bool2= true;
_bool3= true;
break;
case 6:
_bool1= true;
_bool2= true;
_bool3= true;
break;
}
我尝试过创建隐式运算符,如本例中所示,但我看到的唯一被调用的是我的无参数构造函数:
以下是正在反序列化的属性:
private ConvertElement _convertElement;
[XmlElement("ConvertElement", typeof(ConvertElement))]
public ConvertElement ConvertElement
{
get { return _convertElement; }
set { _convertElement= value; }
}
我可以整天反序列化为整数,但由于某些原因,我无法将元素转换为自定义类型。下面是我试图从元素创建的类:
[Serializable]
public class ConvertElement
{
int _value;
bool _bool1;
bool _bool2;
bool _bool3;
public static implicit operator int(ConvertElement x)
{
return x.Value;
}
public static implicit operator ConvertElement(int value)
{
return new ConvertElement(value);
}
public int Value
{
get { return _value; }
set { _value = value; }
}
public ConvertElement()
{
}
public DocSelection(int value)
{
_value= value;
switch (_value)
{
case 0:
_bool1= true;
break;
case 1:
_bool2= true;
break;
case 2:
_bool1= true;
_bool2= true;
break;
case 3:
_bool3= true;
break;
case 4:
_bool1= true;
_bool3= true;
break;
case 5:
_bool2= true;
_bool3= true;
break;
case 6:
_bool1= true;
_bool2= true;
_bool3= true;
break;
}
}
}
您可能必须使用
IXmlSerializable
接口来执行自定义反序列化
例如:
public class ConvertElement : IXmlSerializable
{
private int _value;
private bool _bool1;
private bool _bool2;
private bool _bool3;
public ConvertElement()
{
}
#region IXmlSerializable implementation
public void WriteXml(XmlWriter writer)
{
writer.WriteValue(_value);
}
public void ReadXml(XmlReader reader)
{
_value = int.Parse(reader.ReadString());
DocSelection(_value);
}
public XmlSchema GetSchema()
{
return null;
}
#endregion
public void DocSelection(int value)
{
_value = value;
switch (_value)
{
case 0:
_bool1 = true;
break;
case 1:
_bool2 = true;
break;
case 2:
_bool1 = true;
_bool2 = true;
break;
case 3:
_bool3 = true;
break;
case 4:
_bool1 = true;
_bool3 = true;
break;
case 5:
_bool2 = true;
_bool3 = true;
break;
case 6:
_bool1 = true;
_bool2 = true;
_bool3 = true;
break;
}
}
我的测试:
Xml:
序列化:
TestClass test = new TestClass
{
ConvertElement = new ConvertElement()
};
XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));
using (FileStream stream = new FileStream("c:\\ConvertElement.xml", FileMode.OpenOrCreate))
{
xmlSerializer.Serialize(stream, test);
}
反序列化:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));
using (FileStream stream = new FileStream("c:\\ConvertElement.xml", FileMode.Open))
{
var result = xmlSerializer.Deserialize(stream);
}
结果:
转换\u值
并设置布尔值
请注意,您的布尔值遵循一种二进制模式:_bool1=(_valFromXML+1)&1>0_bool2=(_valFromXML+1)和2>0_bool3=(_valFromXML+1)和4>0;谢谢你的快速回复。实现IXmlSerializable正是我所缺少的。请注意,如果在需要自定义反序列化的元素之后有更多XML要读取,则必须在reader.ReadString()之后进行此调用:reader.ReadEndElement();
TestClass test = new TestClass
{
ConvertElement = new ConvertElement()
};
XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));
using (FileStream stream = new FileStream("c:\\ConvertElement.xml", FileMode.OpenOrCreate))
{
xmlSerializer.Serialize(stream, test);
}
XmlSerializer xmlSerializer = new XmlSerializer(typeof(TestClass));
using (FileStream stream = new FileStream("c:\\ConvertElement.xml", FileMode.Open))
{
var result = xmlSerializer.Deserialize(stream);
}