Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 结构的ObjectSerializer数组字段_C#_Arrays_Xml_Serialization_Field - Fatal编程技术网

C# 结构的ObjectSerializer数组字段

C# 结构的ObjectSerializer数组字段,c#,arrays,xml,serialization,field,C#,Arrays,Xml,Serialization,Field,嗯,我正在研究C#,我正在尝试将一个结构序列化为XML,它可以很好地处理除字节数组之外的所有字段 代码是这样的: public struct myStruct { int field1; string field2; byte[] field3; } public void function() { myStruct struct = new myStruct(); /* Fields Loads */ string

嗯,我正在研究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);
}
public struct myStruct
{ 
int field1;
字符串字段2;
字节[]字段3;
}
公共空间功能()
{
myStruct struct=new myStruct();
/*
字段负载
*/
string text=ObjectSerializer.ToXml(struct);
File.writealText(myPath,text);
}
在执行并查看生成的.txt之后,所有字段都很好,但我没有字节[]的项 我的标签上只有“AQIBA”之类的字符串


我希望你能帮助我

我的例子也没有正常工作

请查看Microsoft文档。 在示例中,您将找到DataContractAtribute
[xmlement(DataType=“hexBinary”)]

默认情况下,以w3c标准格式序列化字节数组。这就是当您在XML中看到一个类似于
“AQIBA”
的字符串或类似的字符串作为
字段3
的值时所看到的

此外,还支持文档中提到的,并可按如下方式启用:

[XmlElement(DataType = "hexBinary")]
public byte [] field3;
<myStruct>
  <field1>101</field1>
  <field2>hello world</field2>
  <field3>0</field3>
  <field3>1</field3>
  <field3>2</field3>
  <!--Additional field3 items as required -->
</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();
    }
}
由于
base64Binary
是w3c标准编码,用于表示任意二进制数据,因此任何XML序列化程序都应该支持它。然而,似乎必须将
字节[]字段3
数组编码为一组重复的
元素,如下所示:

[XmlElement(DataType = "hexBinary")]
public byte [] field3;
<myStruct>
  <field1>101</field1>
  <field2>hello world</field2>
  <field3>0</field3>
  <field3>1</field3>
  <field3>2</field3>
  <!--Additional field3 items as required -->
</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。原型


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

我理解您的更正并实现了答案,但它仍然不起作用。事实上,它与我的原始代码做了相同的事情。除了我得到的byte[]字段AQIDBA==我需要一个接一个的数组元素外,所有字段都保存正确。在这篇文章中,我已经阅读了一些关于使用base 64编码字节数组的内容,但我不知道如何解决它1)您需要公开myStruct的所有字段/属性。目前没有一个是公共的,因此没有任何内容将被序列化。那是打字错误吗?2) 您能否共享
ObjectSerializer.ToXml()的代码?
?3)您是否有要(反)序列化的精确XML格式?4) 您可以将结构更改为类吗?