Avatar billede quaser Nybegynder
23. juli 2003 - 11:58 Der er 4 kommentarer og
1 løsning

Gemme Order object som xml file (inklusiv read-only properties)

Hej

Jeg ønsker at gemme et order object, som har nogle  properties der er read-only.
Har f.eks. en property der hedder Pris, der beregner prisen for hele ordren.

Pris er readonly, da det ikke skal være muligt at kunne ændre den direkte.

Jeg leder efter en component/object gerne i .Net frameworket, der kan hælpe mig med at gemme objectet inklusiv read-only felter.
Jeg har intet brug for at kunne deserialize xml filen tilbage til et Order object.

Har pt. øvet mig med System.Xml.Serialization.XmlSerializer men den vil kun gemme properties der har set og get metoder. Og objecter som ligger på Order objectet skal have en default constructor.


Findes der et object eller en component der kan klare dette for mig, eller skal jeg til at generere xml documentet "fra bunden", udfra Order objectet?
Avatar billede Slettet bruger
23. juli 2003 - 16:38 #1
Serialization og DeSerialization skal klares af objektet selv, da du jo vil serialisere read only værdier, som jo ikke kan sættes direkte udefra.
Du må kunne bruge ISerializable
Avatar billede quaser Nybegynder
23. juli 2003 - 17:00 #2
Har tjekket følgende 2 links.
http://www1.cs.columbia.edu/~lok/csharp/refdocs/System.Runtime.Serialization/types/ISerializable.html
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemRuntimeSerializationISerializableClassTopic.asp

Ser ikke ud til at jeg kan få noget xml ud den vej, hvis du kender en måde hvor på man kan, evt. bare komme med et link.

Pt. gør jeg brug af System.Xml.XmlTextWriter og skriver selv hele xmlfilen, men giver omkring 140 liniers trivielt kode ala.

xw2.WriteStartElement( "Order" );
xw2.WriteElementString( "OrderID", o.OrderID.ToString() );
xw2.WriteEndElement( "Order" );

Jeg vil hellere have en metode hvor jeg egenlig bare kan sende mit Order object ind i.
Avatar billede Slettet bruger
24. juli 2003 - 09:02 #3
En lille demo

Jeg har lavet en klasse der hedder Order:
public class Order : ISerializable
    {
   
        private int test, test1;
        public Order()
        {
            test1=test=4;
        }

        public int Test
        {
            get
            {
                return test;
            }
            set
            {
                test = value;
            }
        }

        public int Test1
        {
            get
            {
                return test1;
            }
        }

        protected Order(SerializationInfo info, StreamingContext context)
        {
            test = info.GetInt32("Test");
            test1 = info.GetInt32("Test1");
        }

        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Test", test);
            info.AddValue("Test1", test1);
        }
    }

og en klasse der hedder Obj2XML
    public class Obj2XML
    {
        private Obj2XML()
        {
        }

        public static string Serialize(ISerializable obj)
        {
            StringBuilder result = new StringBuilder();
            StreamingContext ctx = new StreamingContext(StreamingContextStates.All); // just need the object
            SerializationInfo inf = new SerializationInfo(obj.GetType(), new FormatterConverter());
            obj.GetObjectData(inf, ctx);
            SerializationInfoEnumerator e = inf.GetEnumerator();
            result.Append("<");
            result.Append(obj.GetType().ToString());
            result.Append(">");
            while (e.MoveNext())
            {
                result.Append("<");
                result.Append(e.Name);
                result.Append(">");
                result.Append(e.Value.ToString());
                result.Append("</");
                result.Append(e.Name);
                result.Append(">");
            }
            result.Append("</");
            result.Append(obj.GetType().ToString());
            result.Append(">");
            return result.ToString();
        }
    }

dem bruger jeg på følgende måde i en test app:
Order order = new Order();
Debug.Write(Obj2XML.Serialize(order));

hvilket giver:
<TestApp.Order><Test>4</Test><Test1>4</Test1></TestApp.Order>
Avatar billede quaser Nybegynder
24. juli 2003 - 09:33 #4
Ahh, det kan i hvert fald bruges, så må jeg finde ud af om det er sådan at jeg vil gøre det fremover.

Den skal i hvert fald udbygges noget, så den tjekker på om de enkelte properties er collections eller andre objecter, som så også skal ind i xml outputtet.
Avatar billede quaser Nybegynder
24. juli 2003 - 09:34 #5
Takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester