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 :
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
voici le xsd en question :
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>
Le bug se produit sur la réflextion xml du type "momentType"

voici le code généré par xsd2code :
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
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
        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()
Mis à part un typage différent des données, le code généré en mode collection = array est semblable.
D'avance merci à ceux qui pourront m'aider à comprendre ce qui se passe.