结构的 ObjectSerializer 数组字段
ObjectSerializer array field of struct
好吧,我正在使用 C#,我正在尝试序列化为 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 所有字段都很好,但我没有 byte[] 的项目
我只有像 "AQIBA" 或类似
这样的字符串的标签
希望你能帮帮我
我的例子也没有正常工作。
查看 Microsoft 文档。
在示例中,您会发现 DataContractAtribute [XmlElement(DataType = "hexBinary")]
https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute(v=vs.110).aspx
默认为XmlSerializer
serializes byte arrays in the w3c standard base64Binary
格式。这就是当您在 XML 中看到 字符串 "AQIBA"
或类似 的值时所看到的 field3
.
另外hexBinary
is also supported as mentioned in the documentation for 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
的属性不是您问题中显示的 private
或 internal
。
好吧,我正在使用 C#,我正在尝试序列化为 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 所有字段都很好,但我没有 byte[] 的项目 我只有像 "AQIBA" 或类似
这样的字符串的标签希望你能帮帮我
我的例子也没有正常工作。
查看 Microsoft 文档。
在示例中,您会发现 DataContractAtribute [XmlElement(DataType = "hexBinary")]
https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute(v=vs.110).aspx
默认为XmlSerializer
serializes byte arrays in the w3c standard base64Binary
格式。这就是当您在 XML 中看到 字符串 "AQIBA"
或类似 的值时所看到的 field3
.
另外hexBinary
is also supported as mentioned in the documentation for 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
的属性不是您问题中显示的 private
或 internal
。