struct的ObjectSerializer数组字段

时间:2017-01-24 15:10:46

标签: c# arrays xml serialization field

好吧,我正在研究C#,我正在尝试将XML序列化为XML,除了字节数组之外,所有字段都能正常工作

代码是这样的:

public struct myStruct
{ 
    int field1;
    string field2;
    byte[] field3;
}

public void function()
{
     myStruct struct = new myStruct();
    /*
        Fields Loads
    */
    string text = ObjectSerializer<myStruct>.ToXml(struct);
    File.WriteAllText(myPath, text);
}

执行后看到我生成的.txt所有字段都没问题,但是我没有字节[]的项目 我只有像“AQIBA”之类的字符串,或者像

这样的字符串

我希望你能帮助我

2 个答案:

答案 0 :(得分:0)

我的例子也没有正常工作。

查看Microsoft文档。 在测试中,您将找到DataContractAtribute [XmlElement(DataType = "hexBinary")]
https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute(v=vs.110).aspx

答案 1 :(得分:0)

默认情况下,XmlSerializer以w3c标准base64Binary格式序列化字节数组。当您在XML中看到"AQIBA"之类的字符串或类似之类的字符串field3时,就会看到这一点。

此外,hexBinary的文档中也提到了XmlElementAttribute.DataType的支持,可以按如下方式启用:

[XmlElement(DataType = "hexBinary")]
public byte [] field3;

由于base64Binary是用于表示任意二进制数据的w3c标准编码,因此任何XML序列化程序都应该支持它。不过,您似乎必须byte[] field3数组编码为重复的<field3>元素集,如下所示:

<myStruct>
  <field1>101</field1>
  <field2>hello world</field2>
  <field3>0</field3>
  <field3>1</field3>
  <field3>2</field3>
  <!--Additional field3 items as required -->
</myStruct>

不幸的是,似乎无法通过XML serialization attributes强制执行此操作。相反,您需要将代理数组属性添加到myStruct,如下所示:

public struct myStruct
{
    public int field1;
    public string field2;

    [XmlElement("field3")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DebuggerBrowsable(DebuggerBrowsableState.Never)]
    public ValueWrapper<byte>[] Field3Xml { get { return field3.ToWrapperArray(); } set { field3 = value.FromWrapperArray(); } }

    [XmlIgnore]
    public byte[] field3;
}

public struct ValueWrapper<T> where T : IConvertible
{
    [XmlText]
    public T Value { get; set; }

    public static implicit operator ValueWrapper<T>(T b)
    {
        return new ValueWrapper<T> { Value = b };
    }

    public static implicit operator T(ValueWrapper<T> wrapper)
    {
        return wrapper.Value;
    }
}

public static class ValueWrapperExtensions
{
    public static ValueWrapper<T>[] ToWrapperArray<T>(this T[] values) where T : IConvertible
    {
        if (values == null)
            return null;
        return values.Select(b => (ValueWrapper<T>)b).ToArray();
    }

    public static T [] FromWrapperArray<T>(this ValueWrapper<T>[] values) where T : IConvertible
    {
        if (values == null)
            return null;
        return values.Select(v => v.Value).ToArray();
    }
}

这将生成您需要的XML。原型fiddle

最后,XmlSerializer仅序列化 public 字段和属性。检查以确保myStruct的属性不是privateinternal,如问题所示。