Toon posts:

[C#] custom serializatie van object

Pagina: 1
Acties:

Verwijderd

Topicstarter
In een .Net 1.1 project wil ik voor een class de serialisatie v/e primitive property beinvloeden. Deze class is de hoofdklasse v/e objectenmodel welke in de applicatie wordt gebruikt en bevat een verzameling primitieve en classproperties (arrays van bepaalde objecten).

Nu kan ik IXmlSerializable implementeren en vervolgens de WriteXml methode implementeren, maar dan moet ik voor de gehele class (en dus onderliggende objectenmodel) de serialisatie schrijven. Dit wordt veel werk. Kan dit ook anders?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Ik begrijp dus dat je wilt gebruik maken van de XmlSerializer ( aangezien je het hebt over de IXmlSerializable), en het dus niet hebt over serializatie mbhv de Soap- of BinaryFormatter ?

Wat bedoel je precies met de serializatie van een property beinvloeden ? Wat wil je precies doen ? Kan je jouw gewenste resultaat niet bekomen door gebruik te maken van de "Xml serializatie attributes" ?

https://fgheysels.github.io/


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Verwijderd schreef op dinsdag 10 april 2007 @ 17:38:
Nu kan ik IXmlSerializable implementeren en vervolgens de WriteXml methode implementeren, maar dan moet ik voor de gehele class (en dus onderliggende objectenmodel) de serialisatie schrijven. Dit wordt veel werk. Kan dit ook anders?
Dat laatste hoeft niet per se. Je kunt toch alleen een WriteXml schrijven voor de class die je 'anders' geserialiseerd wil hebben, en voor elk van zijn members de serialisatie weer delegeren aan de .NET XML serializer (vooropgesteld dat je die 'normaal' wil serialiseren)? Nooit geprobeerd, maar het zou wel moeten werken.

En idd, kijk eerst eens of je niet met XmlElementAttribute en co. kunt bereiken wat je wilt.

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Er schiet me net nog een mogelijkheid te binnen. Vaak is het wel mogelijk is om een class-representatie te maken die instances naar jouw wens serialiseert, maar deze class is meestal niet prettig in het gebruik vanuit je .NET code.

De oplossing is in dit geval om beide classes te maken, bijv. een Acme class die prettig is voor .NET code, en een AcmeSerialized class die gebruikt moet worden tijdens serialisatie. Classes die een Acme property hebben, moeten deze property attribueren met [XmlIgnore], en krijgen daarnaast ook een AcmeSerialized property (die dus wel wordt geserialiseerd).
De class krijgt alleen een private member voor Acme, maar niet voor AcmeSerialized.
In plaats daarvan zorg je ervoor dat tijdens het getten van AcmeSerialized een nieuwe instance van AcmeSerialized wordt gemaakt op basis van de inhoud van Acme, en tijdens het setten dat de inhoud van AcmeSerialized wordt gebruikt om Acme te vullen.

Een redelijk elegante oplossing; je krijgt alleen een extra property erbij.
Zie http://www.codeproject.com/soap/xmlsettings.asp

--edit
Blijkbaar had ik het artikel iets anders in m'n hoofd zitten. Voor serialisatie kun je natuurlijk zowel een string gebruiken (zie artikel) als een custom class die specifiek voor serialisatie is geschreven.

Trouwens, wat is dat nou? Ben je 's avonds niet meer aan het werk/unittesten?

[ Voor 12% gewijzigd door MrBucket op 10-04-2007 22:38 ]


Verwijderd

Topicstarter
@whoami:
Wil inderdaad gebruik maken v/d XmlSerializer. Bedoeling is om een string in de class te serializeren middels WriteRaw() ipv (de standaard door de .net serializer gebruikte) WriteString(), omdat ik xml tags wil schrijven. Met attributes krijg je dit niet voor elkaar.

@MrBucket:
Naar mijn weten is het zo dat als je WriteXml implementeert, je de serializatie voor de gehele class moet schrijven (en dus ook onderliggende classes). Als ik expliciet voor resterende members de serializatie kan delegeren aan de .net serializer zou dit een oplossing zijn.

Het Acme voorbeeld dat je beschrijft heb ik al eens gebruikt, maar zal in dit geval niet de oplossing bieden aangezien ik expliciet wil dat een string in de class wordt geserialiseerd met XmlWriter.WriteRaw (ipv XmlWriter.Writestring), dit moet ik dus custom doen.

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Verwijderd schreef op woensdag 11 april 2007 @ 18:13:
@MrBucket:
Naar mijn weten is het zo dat als je WriteXml implementeert, je de serializatie voor de gehele class moet schrijven (en dus ook onderliggende classes). Als ik expliciet voor resterende members de serializatie kan delegeren aan de .net serializer zou dit een oplossing zijn.
Lijkt me dat dit gewoon moet kunnen. Je krijgt dan zoiets:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
class Acme: IXmlSerializable{
   public Foo MyFooProperty { /**/ }

   public void WriteXml(XmlWriter writer){
       //Custom stuff goes here...
       XmlWriter.WriteStartElement("Bla");  //Etc.

       //Serialize other properties using XmlSerializer
       XmlSerializer xs = new XmlSerializer(typeof(Foo));
       xs.Serialize(writer, this.MyFooProperty);
   }
}
Pagina: 1