Braki w XMLu po serializacji

0

Witajcie,

Mam pewien problem z serializacją, mimo że (tak mi się wydaje) wszystkie parametry są identyczne, to część nie serializuje się. Korzystam z wystawionego mi webserwisu, tworzę sobie obiekt z tego webserwisu, a następnie, chcę wszystko wrzucić do XMLa. Część parametrów mi ginie w pliku wyjściowych.

Mam taką klasę w webserwisie (wszystkie pola mają taki sam nawias kwadratowy i są tak samo public):

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "1.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://namespace_jakis.pl")]
public partial class prosta_klasa {    
    private string pole1Field;      
    private System.DateTime pole2Field;    
    private bool pole3Field;    
    private System.DateTime pol4Field;

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string pole1 {
        get {
            return this.pole1Field;
        }
        set {
            this.poleField = value;
        }
    }

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
    public System.DateTime pole2 {
        get {
            return this.pole2Field;
        }
        set {
            this.pole2Field = value;
        }
    }

(...) i tak dalej

}

Już w aplikacji tworzę sobie XMLa:

prosta_klasa[] data = {new prosta_klasa
            {    
                
                pole1 = "xxx",                
                pole2 = DateTime.Parse("2014-01-21"),
                pole3 = true,
                pole4 = DateTime.Parse("2014-01-21")
            }
        };

            var serializer = new XmlSerializer(typeof(prosta_klasa));
            
            using (var ms = new MemoryStream())
            {
                serializer.Serialize(ms, data[0]);
                ms.Position = 0;
                var sr = new StreamReader(ms);
                var myStr = sr.ReadToEnd();
                Console.WriteLine(myStr);
                pismoXML = myStr;

            }
(...)

XML wygląda tak:

 <dane xmlns="http://namespace_jakis.pl">
    <pole1>xxx</pole1>
    <pole4>2014-01-21</pole4>    
  </dane>

Co może być przyczyną pominięcia pole2 i pole3? Co mógłbym sprawdzić? Od czego pierwszego zacząć?
Dzięki i pozdrawiam.

0

Wydaje mi się że to:

   serializer.Serialize(ms, data[0]);

podajesz pierwszą wartość z tablicy, zamiast całej tablicy, ewentualnie pętla która przeleci po całej tablicy.

0

Jesteś pewien, że tak się używa właściwości XmlElementAttribute.DataType?

P.S. Czemu nie używasz automatycznych właściwości i usingów?

0

Pierwsza klasa (prosta_klasa) jest wygenerowana automatycznie, na podstawie WSDLa, nie miałem wpływu na jej wygląd. Cała aplikacja opiera się na webserwisie. Chcę do niego wysłać xml wygenerowany na jego własnej podstawie.

Natomiast nie rozumiem o co pytasz z automatycznymi właściwościami i usingami. Mógłbyś rozwinąć myśl? (problem wynika z mojego braku wiedzy)

Pozdrawiam.

0

Odpowiedź że jest to klasa generowana wyjaśnia usingi i właściwości :)
Wrzuć właściwość pole2 i pole4 może się czymś różnią

0

Dobra, udało mi się znaleźć przyczynę, ale jej nie rozumiem. Poproszę o wyjaśnienie.

Chodzi o to, że zmienne które mi się nie serializowały mają w dodatkowe gettery i settery dla takiej samej nazwy, ale ze specified na końcu. Dla przykładu pole2 wygląda to tak:

private System.DateTime pole2Field;  
 private bool pole2FieldSpecified;  

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
    public System.DateTime pole2 {
        get {
            return this.pole2Field;
        }
        set {
            this.pole2Field = value;
        }
    }

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

po zbudowaniu obiektu tak:

prosta_klasa[] data = {new prosta_klasa
            {    
 
                pole1 = "xxx",                
                pole2 = DateTime.Parse("2014-01-21"),
                pole2specified = true
            }
        };

wszystko już się generuje prawidłowo.

Teraz pytanie - dlaczego tak? Czy liczy się słowo kluczowe specified, czy może kolejność obiektów w klasie XMLa? Skąd serializator wie, że pole po których wystąpiło pole z tą samą nazwą ale ze specified na końcu mają być opcjonalne i że określenie tego specified decyduje, czy pole się pojawi czy nie?

0

zamiast "public bool data_wprowadzeniaSpecified" powinno być oczywiście "public bool pole2Specified"

0

XmlIgnoreAttribute nazwa atrybutu mówi sama za siebie

0

hm... na zdrowy rozum "XmlIgnoreAttribute" mówi żeby zignorować zmienną "pole2Specified" a nie "pole2", a tymczasem w deklaracji obiektu ustawiam "pole2Specified", które jest XmlIgnoreAttribiute" i nim dopiero steruję wyświetlaniem zmiennej "pole2". Ale ok, załóżmy że kompilator domyśla się na podstawie nazw co ma robić, jak znajdę wolną chwilę to przetestuje działanie na własnych zmiennych.

Pozdrawiam.

0
Serializator napisał(a):

Ale ok, załóżmy że kompilator domyśla się na podstawie nazw co ma robić, jak znajdę wolną chwilę to przetestuje działanie na własnych zmiennych.

Tak, jak zwykle winny kompilator. ;P

Co najwyżej w Serializerze jest zaszyta taka dziwna logika. A w ogóle to używasz standardowego Serializera?

0

Wygląda na standardowy.
Co do atrybutu to po prostu ja czytałem szybciej niż myślałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1