Bonjour,
J'utilise xsd2code pour générer le code vb .net à partir d'un fichier xsd.
Xsd2code permet de générer les collections sous différentes formes : array, list, bindinglist, ...
Je préfère les collections de type "list" car plus intuitives à manipuler.
Malheureusement le code généré buggue lors de la sérialisation de la classe.
Le même code généré avec des collections de type "array" fonctionne correctement.
Le plantage ne se produit pas lors de la sérialisation de toutes les "list" mais bien avec certains types de données ... pas facile à expliquer mais plus facile à montrer par l'exemple
Avant d'aller plus loin , le message d'erreur est :voici le xsd en question :Le type d'identificateur de choix 'ItemsElementName' n'est pas cohérent avec le type de 'Items'. Utilisez le tableau de System.Collections.Generic.List
Le bug se produit sur la réflextion xml du type "momentType"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
37
38 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.home.local/schema/v1" targetNamespace="http://www.home.local/schema/v1" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.2"> <xsd:element name="bugmessage" type="momentType" /> <xsd:complexType name="textType" mixed="false"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="L" type="xsd:language" use="required" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="date"> <xsd:restriction base="xsd:date"> <xsd:pattern value="((000[1-9])|(00[1-9][0-9])|(0[1-9][0-9]{2})|([1-9][0-9]{3}))-((0[1-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01]))" /> <xsd:maxInclusive value="9999-12-31" /> <xsd:minInclusive value="1901-01-01" /> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="time"> <xsd:restriction base="xsd:time"> <xsd:pattern value="(([01][0-9])|(2[0-3]))(:[0-5][0-9]){2}(\.[0-9]+)?" /> <xsd:minInclusive value="00:00:00" /> <xsd:maxInclusive value="23:59:59" /> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="momentType"> <xsd:choice> <xsd:choice> <xsd:element name="year" type="xsd:gYear" /> <xsd:element name="yearmonth" type="xsd:gYearMonth" /> </xsd:choice> <xsd:sequence> <xsd:element name="date" type="xsd:date" /> <xsd:element name="time" type="xsd:time" minOccurs="0" /> </xsd:sequence> </xsd:choice> </xsd:complexType> </xsd:schema>
voici le code généré par xsd2code :
et voici quelques lignes de code pour faire planter la sérialisation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 Imports System Imports System.Diagnostics Imports System.Xml.Serialization Imports System.Collections Imports System.Xml.Schema Imports System.ComponentModel Imports System.Collections.Generic Namespace mxsd2code <System.Diagnostics.DebuggerStepThroughAttribute()> _ Partial Public Class momentType Private itemsField As List(Of Object) Private itemsElementNameField As List(Of ItemsChoiceType) Public Sub New() MyBase.New() Me.itemsElementNameField = New List(Of ItemsChoiceType) Me.itemsField = New List(Of Object) End Sub <System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")> _ Public Property Items() As List(Of Object) Get Return Me.itemsField End Get Set(ByVal value As List(Of Object)) Me.itemsField = Value End Set End Property <System.Xml.Serialization.XmlIgnoreAttribute()> _ Public Property ItemsElementName() As List(Of ItemsChoiceType) Get Return Me.itemsElementNameField End Get Set(ByVal value As List(Of ItemsChoiceType)) Me.itemsElementNameField = Value End Set End Property End Class Public Enum ItemsChoiceType '''<remarks/> [date] '''<remarks/> time '''<remarks/> year '''<remarks/> yearmonth End Enum <System.Diagnostics.DebuggerStepThroughAttribute()> _ Partial Public Class textType Private lField As String Private valueField As String Public Property L() As String Get Return Me.lField End Get Set(ByVal value As String) Me.lField = Value End Set End Property <System.Xml.Serialization.XmlTextAttribute()> _ Public Property Value() As String Get Return Me.valueField End Get Set(ByVal value As String) Me.valueField = Value End Set End Property End Class End Namespace
Mis à part un typage différent des données, le code généré en mode collection = array est semblable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Dim mt2 As New mxsd2code.momentType mt2.Items.Add(New Object() {Date.Parse("10/12/1978")}) mt2.ItemsElementName.Add(mxsd2code.ItemsChoiceType.date) Fich = New System.IO.StreamWriter("c:\momentXType.xml") XSerial = New XmlSerializer(GetType(mxsd2code.momentType)) XSerial.Serialize(Fich, mt2) Fich.Close()
D'avance merci à ceux qui pourront m'aider à comprendre ce qui se passe.
Partager