C # XmlSerializer игнорирует атрибут xs: с типами, отличными от xs: string - PullRequest
1 голос
/ 09 февраля 2011

моя проблема кажется очень странной, и я не нашел ничего другого с этой проблемой, поэтому я думаю, что это очень простая и глупая ошибка, которую я не могу обнаружить.

У меня естьXSD, из которого я генерирую структуру класса, используя xsd.exe.Я «заполняю» свой объект значениями, но при сериализации его в XML он игнорирует все свойства класса, которые не относятся к типу string.

var myGraph = new graph();
myGraph.myString = "hallo";
myGraph.myInt = 80;

var serializer = new XmlSerializer(typeof(graph));
TextWriter writeFileStream = new StreamWriter(Path.Combine(outFolder, outFile));
serializer.Serialize(writeFileStream, myGraph);
writeFileStream.Close();

Я ожидал:

<graph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
    myString="hallo" 
    myInt="80"
/>

Фактический результат:

<graph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    myString="hallo" 
/>

Атрибут myInt был проигнорирован.Если я определю его как строку, он также появится, но, как и любой другой тип, он не будет отображаться.Если я объявлю его required и оставлю null, он будет сериализован как myInt="0".

Что мне не хватает?

Некоторые детали:

XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="graph">
    <xs:complexType>
      <xs:attribute name="myString" type="xs:string" />
      <xs:attribute name="myInt" type="xs:int" />
    </xs:complexType>
  </xs:element>
</xs:schema>

сгенерированный класс:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=false)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class graph {
    private string myStringField;
    private int myIntField;

    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public string myString {
        get { return this.myStringField; }
        set { this.myStringField = value; }
    }

    [System.Xml.Serialization.XmlAttributeAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified)]
    public int myInt {
        get { return this.myIntField; }
        set { this.myIntField = value; }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool myIntSpecified {
        get { return this.myIntFieldSpecified; }
        set { this.myIntFieldSpecified = value; }
    }

Ответы [ 3 ]

7 голосов
/ 09 февраля 2011

XSD добавит дополнительное «указанное» поле для всех свойств, которые являются типами значений. При использовании сериализации .NET с типами значений вам всегда нужно будет указывать значение поля и устанавливать для соответствующего «указанного» свойства значение true.

Измените свой код на этот, и он будет работать как положено:

var myGraph = new graph();
myGraph.myString = "hallo";
myGraph.myInt = 80;
myGraph.myIntSpecified = true;
2 голосов
/ 09 февраля 2011

Я не уверен на 100% в этом, но помню что-то подобное.Видите сгенерированное поле myIntSpecified?Вам следует установить для этого параметра значение true.

xsd.exe имеет некоторые большие ограничения, вы можете поискать альтернативы в Google или просто не забывать устанавливать его в любое время.:)

0 голосов
/ 09 февраля 2011

Там что-то еще происходит на вашей стороне, мой друг.Я скомпилировал код, и он отлично работал:

класс:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = false)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class graph
{
    private string myStringField;
    private int myIntField;

    [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
    public string myString
    {
        get { return this.myStringField; }
        set { this.myStringField = value; }
    }

    [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
    public int myInt
    {
        get { return this.myIntField; }
        set { this.myIntField = value; }
    }


}

Код:

    graph g = new graph() {myInt = 80, myString = "ali"};
    XmlSerializer xss = new XmlSerializer(typeof (graph));
    MemoryStream ms = new MemoryStream();
    xss.Serialize(ms, g);
    StreamReader sb = new StreamReader(ms);
    ms.Position = 0;
    Console.WriteLine(sb.ReadToEnd());

Вывод:

<graph xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org
/2001/XMLSchema-instance" myString="ali" myInt="80" />
...