如何通过c#中的XML序列化输出十六进制数?

Gio*_*Gio 5 c# hex xmlserializer

我有一些类和结构,我使用XML序列化来保存和调用数据,但我想要的一个功能是以十六进制表示形式输出整数.是否有任何属性可以挂在这些结构上以实现这一目标?

cod*_*ife 5

有一些代码味道,但是以下方法可以工作:

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)


Kei*_*thS 2

您可以实现完全自定义的序列化,但这可能有点太多了。如何公开一个属性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] 对其进行标记即可。