Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C# .NET] XML Serializer - Element type

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

In C# .NET heb ik een aantal objecten (klassen) kunnen serializen en exporteren naar een XML formaat. Ik krijg het volgende:

code:
1
2
3
4
5
<Persoon>
  <naam>John Doe</naam>
  <woonplaats>Zwolle</woonplaats>
  <postcode>1234 AB</postcode>
</Persoon>


Dit is allemaal prima, alleen wil ik ook de types van alle variabellen binnen deze klasse ook in de XML formaat kunnen zien. Zoals:

code:
1
2
3
4
5
<Persoon>
  <naam type="String">John Doe</naam>
  <woonplaats type="String">Zwolle</woonplaats>
  <postcode type="String">1234 AB</postcode>
</Persoon>


Wat moet ik voor elk public variabele of public property zetten om de types ook mee in het XML formaat mee te nemen? Weet iemand hier een oplossing voor?

Is het misschien mogelijk om het hele object, inclusief structuur, types etc. direct in een XML formaat te exporteren (serializen)?

  • Piels
  • Registratie: Maart 2001
  • Laatst online: 27-11 14:22
Misschien is het makkelijk als je je serialze code even post :)

Maar wat je volgens mij gewoon wilt is een Attribute mee serializen. Als je in een van je klassen een property "Type" hebt, lijkt het me redelijk eenvoudig.

Google knows

Windows Phone Apps: Belstatus, Pinautomaten


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

code:
1
2
3
4
5
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;

SoapFormatter fmt = new SoapFormatter;
fmt.Serialize(stream, jouwObject);


That's it. O en vergeet niet de System.Runtime.Serialization.Formatters.Soap reference aan je project toe te voegen.

SoapFormatter is een stuk handiger (pakt ook direct interne variabelen, daarnaast kun je als jouw object ISerialize interface implementeert precies zelf bepalen welke velden worden 'opgeslagen') dan de System.Xml.Serialization namespace.

Bovenstaan werkt met elk object waaraan het attribute 'Serializable' is toegekend.

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
SoapFormater: Is dit niet via het SOAP protocol? Bij mij gaat het om lokale bestanden die ik lokaal op mijn hardeschijf wil exporteren. Hieronder de code van het object: (in VB .NET)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Imports System.Xml.Serialization

<XmlTypeAttribute()> _
Public Class Station
    Private _stationnummer As String
    Private _positieX As Double
    Private _positieY As Double

    Public Property stationnummer() As String
        Get
            Return _stationnummer
        End Get
        Set(ByVal value As String)
            _stationnummer = value
        End Set
    End Property

    Public Property positieX() As Double
        Get
            Return _positieX
        End Get
        Set(ByVal value As Double)
            _positieX = value
        End Set
    End Property

    Public Property positieY() As Double
        Get
            Return _positieY
        End Get
        Set(ByVal value As Double)
            _positieY = value
        End Set
    End Property

End Class


In XML formaat krijgt het volgende ouput: (Hij pakt de PUBLIC properties)

code:
1
2
3
4
5
<Station>
      <stationnummer>06273</stationnummer>
      <positieX>25.43</positieX>
      <positieY>74.39</positieY>
</Station>


Wat ik hier nog aan zou willen toevoegen zijn de types: String, Double, Double. Of kan ik dit ergens anders declareren. Het is misschien ook lelijk om het per zo'n <Station> element weer types te gaan declareren... Ideeen?

Je mag BTW in C# code wat voorbeelden geven hoor ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:05
SoapFormatter is een stuk handiger (pakt ook direct interne variabelen, daarnaast kun je als jouw object ISerialize interface implementeert precies zelf bepalen welke velden worden 'opgeslagen') dan de System.Xml.Serialization namespace.
Als je enkel wilt bepalen welke velden 'niet geserializeerd' hoeven te worden, dan is het imho een beetje overkil om ISerializable te implementeren; dan kan je beter met de NonSerialized attribute aan de slag.

Hoedanook, de topicstarter kiest hier voor de XmlSerializer, en daar heeft hij misschien wel een goede reden voor ? Als hij dat niet geeft, dan zou ik ook gewoon de Binary of de Soap Formatter gaan gebruiken; afhankelijk wat je wil gaan doen met die bestanden natuurlijK.

'Probleem' met die Xmlserializer is natuurlijk wel dat hij alleen de public fields en de public properties die zowel een getter als setter hebben, serializeert.

[ Voor 9% gewijzigd door whoami op 02-08-2007 13:09 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op donderdag 02 augustus 2007 @ 13:08:
[...]
Hoedanook, de topicstarter kiest hier voor de XmlSerializer, en daar heeft hij misschien wel een goede reden voor ? Als hij dat niet geeft, dan zou ik ook gewoon de Binary of de Soap Formatter gaan gebruiken; afhankelijk wat je wil gaan doen met die bestanden natuurlijK.
Wat ik eigenlijk probeer te doen is een converter bouwen van objecten naar XML structuur. Ik heb op een lokale HDD binnen een map iets van 20.000 ASCII bestanden die heleboel records bevatten zoals:

code:
1
20073627;28738;21322;2321;21112;Zwolle;0028;s882;N;E;29;


Ik wil nu per bestand, alle records nalopen en objecten van gaan maken. Al deze objecten wil ik in een verzameling (List bijvoorbeeld) opslaan en vervolgens per object exporteren naar een XML structuur. Hetzelfde geldt voor dat voorbeeld hierboven met Stations. XMLSerializer was een van de bekendse die ik ken en vandaar dat ik deze ook hiervoor wou gaan gebruiken. Alles lukt, behalve nog de types van de variabellen, zoals String, Double, Integer etc opslaan. Is het niet mogelijk om deze via het XMLSerializer te achterhalen? Zo niet, hoe kan ik dit via bijvoorbeeld de SoapFormatter doen?

Is het niet mogelijk om een regel code boven een private/public variabele te zetten en zo dus meteen de type van de variabele op te slaan in XML? Zoals:

code:
1
2
3
4
5
6
7
8
[XML........(......)]
public string naam;

[XML........(......)]
public double positieX;

[XML........(......)]
public double positieY;


Alvast bedankt voor de moeite.

Verwijderd

Topicstarter
Is het ook mogelijk om de hele objectstructuur van de klasse via XMLSerializer naar een XML bestand weg te schrijven. Deze kan dan later gebruiken voor deserialize en krijg weer dezelfde objectstructuur terug...

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:05
Dat is net de bedoeling van die serializers, dat je een object of een object graph naar een 'stream' kunt schrijven, en deze daarna terug kunt deserializeren.
Daarom zat ik me ook al af te vragen waarom je die types wilt gaan bijhouden in je file.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op donderdag 02 augustus 2007 @ 14:47:
Dat is net de bedoeling van die serializers, dat je een object of een object graph naar een 'stream' kunt schrijven, en deze daarna terug kunt deserializeren.
Daarom zat ik me ook al af te vragen waarom je die types wilt gaan bijhouden in je file.
Mijn XML Serializer slaat de types niet op... Dus hoe kun je dan deserializen en weten wat voor dype elk atribuut is? :) Daar gaat hier om. Bovenaan heb ik een voorbeeld laten zien wat mijn XMLSerializer als output genereert. Hij exporteert alleen de waardes per object en variabele... Dat is ook wel goed, maar waar wordt de structuur van het object beschreven? Op dit moment nergens....

Hoe exporteer ik dus de complete structuur van het object Station? Dus inclusief een beschrijving over types (String, Integer, Double) etc.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:05
Als je het niet gelooft, test het uit.
Of lees ff in de msdn.
XML serialization is the process of converting an object's public properties and fields to a serial format (in this case, XML) for storage or transport. Deserialization re-creates the object in its original state from the XML output. You can thus think of serialization as a way of saving the state of an object into a stream or buffer. For example, ASP.NET uses the XmlSerializer class to encode XML Web service messages.
Wat heb je aan een serializer als je niet kan deserializen ? De serializer weet adhv het object en de xml file wat wat is.

[ Voor 88% gewijzigd door whoami op 02-08-2007 15:15 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Aha... ik snap het weer ;)

Je hebt 't bestand nodig en binnen je applicatie ook de objectstructuur waarmee het bestand is aangemaakt.

Dus als ik bijvoorbeeld Persoonen object exporteer naar XML. Moet ik het volgende ongeveer doen in mijn app:

code:
1
2
Dim plist As Personen
plist = xmlSerializer.Deserialize(fileStream)


Daarmee genereert ie weer de object structuur aan de hand van de XML componenten binnen het bestand en is het bijhouden van types etc. niet meer nodig ;)

Bedankt allemaal voor de reacites...
Pagina: 1