2010-04-27 6 views
5

J'ai un ensemble de classes VBA dans une base de données MS Access. J'ai une chaîne xml avec des données avec lesquelles je veux créer de nouvelles classes.Désérialisation XML dans VB/VBA

En dehors de la définition individuelle de chaque propriété, existe-t-il un moyen facile de désérialiser le code XML dans mon objet?

Je l'ai vu le code en utilisant la bibliothèque TypeLib

Public Sub ISerializable_Deserialize(xml As IXMLDOMNode) 

    Dim tTLI As TLIApplication 
    Dim tInvoke As InvokeKinds 
    Dim tName As String 
    Dim tMem As MemberInfo 

    tInvoke = VbLet 

    For Each tMem In TLI.ClassInfoFromObject(Me).Members 

    tName = LCase(tMem.Name) 

    CallByName Me, tMem.Name, VbLet, xml.Attributes.getNamedItem(tName).Text 

    Next tMem 
End Sub 

mais cela ne semble pas fonctionner avec les modules de classe standard. Je reçois une erreur 429:

ActiveX Component Cannot Be Created 

Quelqu'un d'autre peut-il m'aider? Je préfère ne pas avoir à régler chaque propriété à la main si je peux l'aider, certaines de ces classes sont énormes!

Répondre

2

Vous ne tTLI par exemple dans ce code & et plus tard s'y référer comme juste TLI il ne fonctionnera pas, l'erreur 429 peut-être parce que la bibliothèque TypeInfo est pas enregistré, il ne vous ajoutez comme référence?

Si vous avez fait ce qui suit fonctionnera:

Dim TLI As TLIApplication 
Dim II As InterfaceInfo 
Dim MI As MemberInfo 

Set TLI = New TLIApplication 
Set II = TLI.InterfaceInfoFromObject(Me) 

For Each MI In II.Members 
    If MI.InvokeKind = InvokeKinds.INVOKE_PROPERTYPUT Then 
     Debug.Print MI.Name 
     TLI.InvokeHook Me, MI.Name, InvokeKinds.INVOKE_PROPERTYPUT, "PROPVALUE" 
    End If 
Next 

Vous pouvez remplacer InvokeHook avec CallByName si vous le souhaitez.

+0

Les classes privées dans une base de données Access ne sont incluses dans aucune bibliothèque de type publique, donc je ne pense pas que cela fonctionnera, même si les fautes de frappe ont été corrigées comme vous l'avez suggéré. Je ne pense pas que 'InterfaceInfoFromObject (Me)' peut réussir parce que les interfaces pertinentes pour 'Me' ne sont pas publiques. – MarkJ

+0

InterfaceInfoFromObject fonctionne via IDispatch :: GetTypeInfo() qui fonctionne dans Access pour moi .. comment comment .. qui sait? –

+0

Merci Alex. Il ne fonctionne toujours pas, il échoue sur le Définir TLI = Nouvelle ligne TLIApplication maintenant avec la même erreur. J'ai référencé la référence typelib, (tlbinf32.dll) est-ce la bonne? Ben. – oharab