[C#] XmlIncludeAttribute typeof nodenaam

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Webby_143
  • Registratie: Januari 2002
  • Laatst online: 03-11-2023
Ik heb svcutil losgelaten op een WSDL en probeer hier nu mee te werken. Het eindresultaat is voor mijn doen nog al ingewikkeld geworden.

Ik heb iets gekregen in de trant van:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Garage
{
  private Vehicle[] collection;

  public Vehicle[] Collection
  {
    get { return this.collection; }
    set { this.collection = value; }
  }
}

[XmlIncludeAttribute(typeof(SportsCar))]
public class Vehicle { }

[XmlIncludeAttribute(typeof(SportsCar))]
public class Car : Vehicle { }

public class SportsCar : Car {}


Ik zou als eindresultaat in xml het volgende moeten krijgen:

code:
1
2
3
4
5
6
<Garage>
  <Collection>
    <Sportscar />
    <Sportscar />
  </Collection>
</Garage>


Dit heb ik als volgt geprobeerd:

code:
1
2
3
4
5
6
7
8
Garage garage = new Garage();

SportsCar sc1 = new SportsCar();
SportsCar sc2 = new SportsCar();

Vehicle[] vehile = new Vehicle[2] { sc1, sc2 };

Garage.Collection = vehicle;


Alleen kloppen de nodenamen nu niet, dit levert het volgende op:

code:
1
2
3
4
5
6
<Garage>
  <Collection>
    <Vehicle />
    <Vehicle />
  </Collection>
</Garage>


Wat resulteert in de volgende schema validatie: "did not expect a Vehicle object at the top level".

Iemand enig idee hoe ik dit wel zou moeten doen?

:: Game Over ::


Acties:
  • 0 Henk 'm!

  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 22-09 12:44

dotcode

///\00/\\

Kijk hier eens voor je oplossing, je moet het attribute op een andere plaats zetten:
http://msdn.microsoft.com/en-us/library/aa302290.aspx

En hier hoe je XmlInclude gebruikt bij webservices
http://www.pluralsight.co...hive/2004/07/08/1580.aspx

Acties:
  • 0 Henk 'm!

  • Webby_143
  • Registratie: Januari 2002
  • Laatst online: 03-11-2023
Dat laatste artikel is inderdaad exact mijn probleem. Helaas hebben ze geen oplossing. Alleen een verbetering vanuit het OO oogpunt, maar het eindresultaat blijft een <Vehicle xsi:type="SportsCar">. Het liefst zie ik ook een oplossing welke niet ligt aan de kant van het aanpassen van de gegenereerde service model code.

Ik ben zelf al wat dingen gaan proberen. Bijv. geen Vehicle array met SportsCars, maar een SportsCar array

code:
1
2
3
4
5
...

SportsCar[] sportsCar = new SportsCar[2] { sc1, sc2 };

Garage.Collection = sportsCar ;


Dit mag gewoon, maar blijft een Vehicle node geven. En tevens is het niet werkbaar, aangezien ik van Car nog 15 Derived types heb, welke allemaal in Garage.Collection moeten kunnen met als resultaat hun classname als nodenaam.

:: Game Over ::


Acties:
  • 0 Henk 'm!

Verwijderd

Als ik zo snel naar je code kijk zie ik dat je SportsCar inherit van Car welke weer inherit is van Vehicle.

Dus het is logisch dat hij Vehicle voor TypeOf gebruikt (zoals die 2e link al aangaf)

ik denk dat dit je zal helpen:

C#:
1
2
3
4
   Vehicle Porsche = new sportsCar();
   String strTypeOf = Convert.ToString(typeof(Porsche)); //Nu kijken we de TypeOf van je Porsche
   console.writeline(strTypeOf);
   //PrintOut: Namespace.sportsCar


EDIT:
sorry verkeerd gezien ik ben niet heel bekend met de XML Serialization, je geeft dus een class door en geen Instance ervan 8)7

Ben toch even zelf dingetjes gaan proberen en ik kreeg op deze manier TOCH sportsCar als nodeName

C#:
1
2
3
4
5
6
7
8
9
10
11
[XmlIncludeAttribute(typeof(sportsCar))]
public class vehicle {  } 

public class car : vehicle {  }

public class sportsCar : car {  } 

vehicle Porsche = new sportsCar();
Porsche.Liter = 3;

//Serialize je object(Porsche) collectie naar XML


De XML code wordt dan:
XML:
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<sportsCar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Liter>3</Liter>
</sportsCar>

[ Voor 50% gewijzigd door Verwijderd op 13-02-2009 23:02 ]


Acties:
  • 0 Henk 'm!

  • Webby_143
  • Registratie: Januari 2002
  • Laatst online: 03-11-2023
Ik krijg dat echt op geen enkele manier voor elkaar. Ik heb nu deze oplossing:

C#:
1
2
3
4
XmlArrayItemAttribute(ElementName = "Vehicle", Type = typeof(Vehicle)]
XmlArrayItemAttribute(ElementName = "Car", Type = typeof(Car)]
XmlArrayItemAttribute(ElementName = "SportsCar", Type = typeof(SportsCar)]
public Vehicle[] Collection { get, set }


Alleen betekend dit dat ik nu dus zelf de met svcutil gegenereerde classfile moet aanpassen. Ik had gehoopt die intact te laten, aangezien ik een cliënt schrijf volgens een standaard die continue veranderd.

Als je alleen met .NET services praat wordt een <Vehicle xsi:type="SportsCar" /> ook correct gedeserialiseerd, maar ik praat met allerlei implementaties (Axis2, Java / Tomcat, etc.)

:: Game Over ::


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
En als je gebruik maakt van WCF? Volgens mij volgt WCF met zijn ServiceContract's en DataContract's en de DataContractSerializer wel gewoon de standaard.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Webby_143
  • Registratie: Januari 2002
  • Laatst online: 03-11-2023
Als je svcutil.exe loslaat op de wsdl met xds(sen) ipv. wsdl.exe krijg je toch een WCF service? System.ServiceModel staat als reference en die Client inheret System.ServiceModel.ClientBase bijv. Ik heb mede voor WCF gekozen ivm. MTOM, dit is een vereiste.

:: Game Over ::


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat zou wel kunnen ja, maar als het goed is krijg je bij WCF services niet deze XML attributes, maar DataContract attributes.

Welke versie van svcutil gebruik je?

[ Voor 13% gewijzigd door Woy op 16-02-2009 14:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Webby_143
  • Registratie: Januari 2002
  • Laatst online: 03-11-2023
Version 3.0.4506.648

Ik heb geen opties gebruikt, gewoon svcutil wsdl xsd xsd xsd xsd. Er zitten 4 xsd's bij welke in de wsdl met <xsd:include gelinkt worden, dan moet je ze allemaal meegeven.

:: Game Over ::


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat lijkt me inderdaad wel de juiste versie. Ik zal het morgen eens testen wat er bij mij uit komt rollen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Webby_143
  • Registratie: Januari 2002
  • Laatst online: 03-11-2023
De oplossing welke ik zelf had gevonden ben ik mee door gaan werken. Dit loopt allemaal lekker. Maar nu heb ik het probleem andersom. Ik zie via wireshark allemaal data binnenkomen, maar precies bij de Vehicle Array krijg ik 0 Items terug. Terwijl er in de data een heleboel SportsCars en Cars zitten. Helaas dus geen foutmelding. Het is een beetje summiere uitleg, maar ik hoop dat bij iemand een belletje gaat rinkelen.

:: Game Over ::


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien erg Captain Obvious maar kan het zijn dat je data != [XML Serializable] (a.k.a. staan er wel XML Attributes boven je Array en de Array Items)? Een stukje code plaatsen kan ook geen kwaad ;)

[ Voor 11% gewijzigd door Verwijderd op 27-03-2009 18:20 ]

Pagina: 1