XML serialize

Status
Niet open voor verdere reacties.

Jayster2

Gebruiker
Lid geworden
3 nov 2008
Berichten
39
Hey, Ik heb nu dit via een tutorial kunnen maken:

Code:
       public class Profile
        {
            [XmlElement("ProfileName")]
            public string Name
            { get; set; }

            [XmlElement("WorkDirectory")]
            public string Directory
            { get; set; }

            [XmlElement("PrefixNormal")]
            public string Norm_prefix
            { get; set; }

            [XmlElement("PrefixSpecular")]
            public string Spec_prefix
            { get; set; }

        }

        static void WritePROFILES(string name, string dir, string norm, string spec)
        {
                Profile profile = new Profile();
                profile.Name = name;
                profile.Directory = dir;
                profile.Norm_prefix = norm;
                profile.Spec_prefix = spec;
                SerializeToXML(profile);
        }

        static public void SerializeToXML(Profile profile)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Profile));
            TextWriter textWriter = new StreamWriter(Environment.CurrentDirectory + "\\" + "users.xml");
            serializer.Serialize(textWriter, profile);
            textWriter.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WritePROFILES("name", "dir", "norm", "spec");
        }

Dat krijgt deze xml output:

[XML]<?xml version="1.0" encoding="utf-8"?>
<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ProfileName>name</ProfileName>
<WorkDirectory>dir</WorkDirectory>
<PrefixNormal>norm</PrefixNormal>
<PrefixSpecular>spec</PrefixNormal>
</Profile>[/XML]

En dat is prima, maar wat als ik nou een file moet saven met meerdere profielen ? bijv name2, dir2, norm2,spec2 wil ik saven in de .xml. Push in right direction?
 
Ik heb nu deze class gemaakt:

[CPP] public class Users
{
public Profile [] ItemsOrders;
}
[/CPP]

Maar begrijp het verder niet. Wat is ItemsOrders ?

En hoe roep ik het aan, zodat ik 2 profielen kan schrijven naar xml ? Ben nog super beginner....

[CPP]
public class Profile
{

[XmlElement("Name")]
public string Name { get; set; }

[XmlElement("WorkDirectory")]
public string Directory { get; set; }

[XmlElement("PrefixNormal")]
public string Norm_prefix { get; set; }

[XmlElement("PrefixSpecular")]
public string Spec_prefix { get; set; }

}
[/CPP]

Dit is mijn writeprofiles functie, Hoe moet ik die aanpassen? Op de Microsoft pagina staat niet beschreven hoe je het moet aanroepen. Er staat alleen hoe je een array object moet maken.
[CPP]
static void WritePROFILES(string name, string dir, string norm, string spec)
{
Profile profile = new Profile();
profile.Name = name;
profile.Directory = dir;
profile.Norm_prefix = norm;
profile.Spec_prefix = spec;
SerializeToXML(profile);
}
[/CPP]

Of moet ik dit aanpassen:

[CPP] static public void SerializeToXML(Profile profile)
{
XmlSerializer serializer = new XmlSerializer(typeof(Profile));
TextWriter textWriter = new StreamWriter(Environment.CurrentDirectory + "\\" + "users.xml");
serializer.Serialize(textWriter, profile);
textWriter.Close();
}[/CPP]

ik heb nog nooit met methodes of classes gewerkt. Heeeeeeelp
 
Laatst bewerkt:
[cpp]
public class Profile {
// ...
}

public class Profiles {
public Profile[] profiles;
// ...
}

// ...
Profiles profiles
// ...
serializer.Serialize(textWriter, profiles); // de inhoud van profiles schrijf je dan dus weg
[/cpp]
 
Waar moet

[CPP]Profiles profiles[/CPP]

En is dit nog wel goed ?

[CPP] Profile profile = new Profile();
profile.Name = name;
profile.Directory = dir;
profile.Norm_prefix = norm;
profile.Spec_prefix = spec;
SerializeToXML(profile);[/CPP]

Of moet het zijn:

[CPP]static void WritePROFILES(string name, string dir, string norm, string spec)
{
Profile profile = new Profile();
profiles.Name = name;
profiles.Directory = dir;
profiles.Norm_prefix = norm;
profiles.Spec_prefix = spec;
SerializeToXML(profile);
}[/CPP]
 
Laatst bewerkt:
Je begrijpt niet helemaal wat de bedoeling is. Maar dat is niet erg, het is vrij gemakkelijk uit te leggen aan de hand van de voorbeelden:

In de eerste code schrijf je een object van de klasse Profile weg:

[cpp]
public class Profile
{
[XmlElement("ProfileName")]
public string Name
{ get; set; }

[XmlElement("WorkDirectory")]
public string Directory
{ get; set; }

[XmlElement("PrefixNormal")]
public string Norm_prefix
{ get; set; }

[XmlElement("PrefixSpecular")]
public string Spec_prefix
{ get; set; }
}
[/cpp]

Dit levert een dergelijke output op:

<Profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ProfileName>name</ProfileName>
<WorkDirectory>dir</WorkDirectory>
<PrefixNormal>norm</PrefixNormal>
<PrefixSpecular>spec</PrefixNormal>
</Profile>

Zoals je kunt zien wordt eigenlijk gewoon de inhoud van het object weggeschreven (Name, WorkDirectory, PrefixNormal en PrefixSpecular).

De code op de voorbeeldsite schrijft een object van de klasse PurchaseOrder weg:

[cpp]
public class PurchaseOrder
{
public Item [] ItemsOrders
}

public class Item
{
public string ItemID
public decimal ItemPrice
}
[/cpp]

De output hiervan is iets als het onderstaande:

<PurchaseOrder xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Items>
<Item>
<ItemID>aaa111</ItemID
<ItemPrice>34.22</ItemPrice>
<Item>
<Item>
<ItemID>bbb222</ItemID>
<ItemPrice>2.89</ItemPrice>
<Item>
</Items>
</PurchaseOrder>

Zoals je kunt zien wordt hier de inhoud van een object van de klasse PurchaseOrder weggeschreven, welke een array van items heeft (en al die items worden dus weggeschreven). In jouw geval wil je eigenlijk hetzelfde als wat hier gebeurt, alleen wil je dan geen array van items gebruiken maar een array van profiles. Je code wordt dan dus iets als:

[cpp]
public class Profile
{
public Profile(string n, string d, string np, string sp)
{
this.namme = n; this.dir = d; this.norm = np; this.spec = sp; // dan kun je de constructor gewoon gebruiken: new Profile("blaat", "blaat", "blaat", "blaat");
}
// ...
}

public class Profiles
{
public Profile[] profiles;
// ...
}

static void WriteProfiles(Profiles p)
{
SerializeToXML(p);
}

// ...
Profiles p = new Profiles();
// alle profielen toevoegen aan p.profiles
WriteProfiles(p);
[/cpp]
 
thx voor je uitgebreide reactie. Ik zal inderaad eerst eens leren hoe properties en classes werken, voordat ik me in dit stort. Je had in eerste instantie al genoeg info gegeven, maar omdat ik die dingen nog niet snapte had ik er niet veel aan. Alsnog bedankt
 
Ik begrijp je uitleg niet.

[CPP]public class Profile
{
public Profile(string n, string d, string np, string sp)
{
this.namme = n; this.dir = d; this.norm = np; this.spec = sp; // dan kun je de constructor gewoon gebruiken: new Profile("blaat", "blaat", "blaat", "blaat");
}
// ...
}
[/CPP]

We hebben een Class "Profile". Vervolgens krijg je een functie (public Profile(string n, string d, string np, string sp)) die je dus kan aanroepen in void main ? Dus als je maar 1 profile wilt wegschrijven dan verwijs je naar die functie die in die class zit, en dan resulteerd dit ( vanuit void_main ): "profile("test") op dat "test" in this.namme word gezet ? Wat is this.namme ? Je bedoelt dus zo ?:

[CPP]public class Profile
{
public Profile(string n, string d, string np, string sp)
{
this.namme = n; this.dir = d; this.norm = np; this.spec = sp; // dan kun je de constructor gewoon gebruiken: new Profile("blaat", "blaat", "blaat", "blaat");
}

[XmlElement("namme")]
public string namme { get; set; }

}[/CPP]

En dan ? Wanneer word het weggeschreven ? Op basis van jou bericht zou ik dit hebben gemaakt:

[CPP]public class Profile
{
public Profile(string n, string d, string np, string sp)
{
this.namme = n; this.dir = d; this.norm = np; this.spec = sp; // dan kun je de constructor gewoon gebruiken: new Profile("blaat", "blaat", "blaat", "blaat");
}
[XmlElement("ProfileName")]
public string Name
{ get; set; }

[XmlElement("WorkDirectory")]
public string Directory
{ get; set; }

[XmlElement("PrefixNormal")]
public string Norm_prefix
{ get; set; }

[XmlElement("PrefixSpecular")]
public string Spec_prefix
{ get; set; }

}

public class Profiles
{
public Profile[] profiles;
[XmlElement("ProfileName")]
public string Name
{ get; set; }

[XmlElement("WorkDirectory")]
public string Directory
{ get; set; }

[XmlElement("PrefixNormal")]
public string Norm_prefix
{ get; set; }

[XmlElement("PrefixSpecular")]
public string Spec_prefix
{ get; set; }

}

static void WriteProfiles(Profiles p)
{
SerializeToXML(p);
}


void_main
{
Profiles p = new Profiles();
WriteProfiles(p);
}
[/CPP]

En dat werkt zoiezo niet. Je hebt alleen een verwijzing gemaakt in void_main die naar de class "Profiles" schrijft, en niet naar "Profile". Dus wat als ik maar 1 profile wil saven ?

Gaat het er nou om dat je eerst values in de objecten/classes zet, en het daarna wegschrijft? Het schrijft gewoon weg wat in de objecten zitten. Via void_main zet je de values in de objecten, maar zon voorbeeld heb je niet gemaakt. Of moet ik een functie maken die values in het object ( of objecten ???? ) veranderd en het niet uit void_main doen?

mijn vmbo brein kan dit niet aan. :( Ik ga er morgen mee verder, :) RAGE. Heb je geen IM, IRC of iets dergelijks? Dan val ik je lastig.
 
Laatst bewerkt:
We hebben een Class "Profile". Vervolgens krijg je een functie (public Profile(string n, string d, string np, string sp)) die je dus kan aanroepen in void main ? Dus als je maar 1 profile wilt wegschrijven dan verwijs je naar die functie die in die class zit, en dan resulteerd dit ( vanuit void_main ): "profile("test") op dat "test" in this.namme word gezet ? Wat is this.namme ? Je bedoelt dus zo ?:

this.namme is uiteraard een typfout en hoort this.name te zijn, heb de code zo getypt en dus niet getest. Een constructor roep je aan bij het aanmaken van het object:

[cpp]
class blaat
{
int x;
public blaat() // standaard constructor -> blaat b = new blaat();
{
x = 0;
}

public blaat(int x) // blaat b = new blaat(5); -> x = 5
{
this.x = x;
}
}
[/cpp]

In het geval van de onderstaande code:

[cpp]
static void WritePROFILES(string name, string dir, string norm, string spec)
{
Profile profile = new Profile();
profile.Name = name;
profile.Directory = dir;
profile.Norm_prefix = norm;
profile.Spec_prefix = spec;
SerializeToXML(profile);
}

[/cpp]

Kun je dan gewoon iets schrijven als:

[cpp]
static void WriteProfile(Profile p) {
// indien je de originele argumenten houdt dan wordt het gewoon: Profile profile = new Profile(naam, dir, norm, spec);
SerializeToXML(p);
}

WriteProfile(new Profile(name, dir, norm, spec));
[/cpp]

En dat werkt zoiezo niet. Je hebt alleen een verwijzing gemaakt in void_main die naar de class "Profiles" schrijft, en niet naar "Profile". Dus wat als ik maar 1 profile wil saven ?

Dan stop je toch maar gewoon één profiel in profiles, lijkt me vrij logisch :p

Gaat het er nou om dat je eerst values in de objecten/classes zet, en het daarna wegschrijft? Het schrijft gewoon weg wat in de objecten zitten. Via void_main zet je de values in de objecten,
maar zon voorbeeld heb je niet gemaakt. Of moet ik een functie maken die values in het object ( of objecten ???? ) veranderd en het niet uit void_main doen?

Wat wil je wegschrijven als er geen data is om weg te schrijven? Dus ja, je moet eerst data invoeren om weg te schrijven (net zoals je dat in je eerste voorbeeld hebt gedaan). Het verschil zit hem er dus in
dat je bij het wegschrijven van een Profile enkel de gegevens van een enkel profiel wegschrijft en bij het wegschrijven van een Profiles een verzameling van profielen (kan er uiteraard ook gewoon ééntje zijn).

Dat je het in void_main schrijft maakt verder weinig uit. Een volledig voorbeeld van de code op de voorbeeld site vind je hier: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx
Met dat voorbeeld zou je het geheel wel werkend moeten krijgen.

mijn vmbo brein kan dit niet aan. Ik ga er morgen mee verder, RAGE. Heb je geen IM, IRC of iets dergelijks? Dan val ik je lastig.

Daarvoor is dit forum toch bedoeld? (maar ja, ik heb wel MSN. Post die van jou maar dan voeg ik je wel toe. Als je maar niet te lastig bent :p)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan