[ Igor Gajic @ 13.11.2012. 17:49 ] @
Potrebno mi je da sledecu klasu:

Code (csharp):

    [Serializable]
    [XmlRoot("Fields")]
    public class Product
    {
        [XmlElement(ElementName = "XPQ-21")]
        public string FirstName { get; set; }

        [XmlElement(ElementName = "SDT-22")]
        public string LastName { get; set; }

    }
 


serijalizujem u sledeci oblik:

Code (xml):

<fields>
     <f>
          <n>XPQ-21</n>
          <v>Igor</v>
     </f>
     <f>
          <n>SDT-22</n>
          <v>Gajic</v>
     </f>
</fields>
 



Da li je moguce ovo uraditi samo koristeci dekoraciju atributima ili moram da zasucem rukave i uradim custom serijalizaciju, preko IXmlSerializable interfejsa ?

U real-world ova klasa ima 40+ propertija, pa bi mi out-of-the-box resenje jako pomoglo.
[ mmix @ 13.11.2012. 18:34 ] @
Imas dve opcije koliko ja vidim:

- Uvek mozes kroz ISerializable da kontrolises izlaz pa i da transformises listu propoertija u listu podobjekata. jednostavnije ali moras rucno da procesiras svaki property

- napravis xslt i transformises xml ove klase u format koji ti treba. Moze da se napravi da dinamicki stransformise sve podnodove ali imas once-off komplikaiju da napravis transformaciju
[ Igor Gajic @ 13.11.2012. 18:38 ] @
Zasad imam sledece parce koda:

Code (csharp):

        #region IXmlSerializable Members

        public XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
           
        }

        public void WriteXml(XmlWriter writer)
        {
            foreach (var property in typeof(Product).GetProperties())
            {
                writer.WriteStartElement("F");

                var elementName = property.Name;
                var customElementAttributes = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                if (customElementAttributes.Length > 0)
                {
                    elementName =  ((XmlElementAttribute)customElementAttributes[0]).ElementName;
                }

                writer.WriteElementString("N", elementName);
                writer.WriteElementString("V", property.GetValue(this, null).ToString());

                writer.WriteEndElement();
            }            
        }

        #endregion
 


To mi zavrsava posao, ali probacu da uradim preko ISerializable interfejsa.

XSLT transformacija ne bi bila preterano komplikovana, ali mislim da bi u ovom slucaju bila overkill za ono sto mi treba (serijalizacija u XML string i prosledjivanje web metodi)
[ Igor Gajic @ 13.11.2012. 20:15 ] @
Na kraju sam implementirao kao posebnu f-ju, bez implementiranja interfejsa...

Code (csharp):

        public string WriteXml()
        {
            StringBuilder sb = new StringBuilder();
            XmlWriterSettings settings = new XmlWriterSettings()
            {
                ConformanceLevel = ConformanceLevel.Auto,
                Encoding = Encoding.UTF8,
                Indent = true,
                CloseOutput = true,
                CheckCharacters = true
            };

            using (XmlWriter writer = XmlWriter.Create(sb, settings))
            {
                writer.WriteStartElement("FIELDS");
                foreach (var property in typeof(Product).GetProperties())
                {
                    writer.WriteStartElement("F");

                    var elementName = property.Name;
                    var customElementAttributes = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                    if (customElementAttributes.Length > 0)
                    {
                        elementName = ((XmlElementAttribute)customElementAttributes[0]).ElementName;
                    }

                    writer.WriteElementString("N", elementName);
                    writer.WriteElementString("V", property.GetValue(this, null).ToString());

                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }

            return sb.ToString();
        }
    }