Gio*_*Gio 5 c# hex xmlserializer
我有一些类和结构,我使用XML序列化来保存和调用数据,但我想要的一个功能是以十六进制表示形式输出整数.是否有任何属性可以挂在这些结构上以实现这一目标?
有一些代码味道,但是以下方法可以工作:
public class ViewAsHex
{
[XmlIgnore]
public int Value { get; set; }
[XmlElement(ElementName="Value")]
public string HexValue
{
get
{
// convert int to hex representation
return Value.ToString("x");
}
set
{
// convert hex representation back to int
Value = int.Parse(value,
System.Globalization.NumberStyles.HexNumber);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台程序中测试该类:
public class Program
{
static void Main(string[] args)
{
var o = new ViewAsHex();
o.Value = 258986522;
var xs = new XmlSerializer(typeof(ViewAsHex));
var output = Console.OpenStandardOutput();
xs.Serialize(output, o);
Console.WriteLine();
Console.WriteLine("Press enter to exit.");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
<?xml version="1.0"?>
<ViewAsHex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Value>f6fd21a</Value>
</ViewAsHex>
Run Code Online (Sandbox Code Playgroud)
您可以实现完全自定义的序列化,但这可能有点太多了。如何公开一个属性MyIntegerAsHex
,该属性将整数返回为字符串,格式为十六进制数:MyInteger.ToString("X");
该属性将需要一个设置器,即使它是一个计算字段,以便可以将序列化对象中的字符串输入到新实例中反序列化。
然后,您可以实现反序列化回调,或者只是将代码放入 setter 中,以便在反序列化对象时将十六进制数字解析为十进制整数:MyInteger = int.Parse(IntegerAsHex, NumberStyles.AllowHexNumber);
因此,总而言之,您的财产将如下所示:
public string MyIntegerAsHex
{
get { return MyInteger.ToString("X"); }
set { MyInteger = int.Parse(value, NumberStyles.AllowHexNumber); }
}
Run Code Online (Sandbox Code Playgroud)
然后,如果您不想在 XML 文件中看到该数字为十进制整数,只需用 [XmlIgnore] 对其进行标记即可。