Newsgroup: it.comp.lang.visual-basic
Titolo: serializzazione e dll

Ciao a tutti,
in una applicazione vb2008 ho una classe che deve essere serializzata.
Fino alle ultime modifiche che ho fatto, tutto andava perfettamente, pero' 
per varie esigenze mi sono trovato a dover cambiare questa classe facendo in 
modo che implementasse una interfaccia definita in una dll.
La classe che utilizzo per serializzare e' la
Xml.Serialization.XmlSerializer.
Mi viene sollevata una eccezione di tipo System.InvalidOperationException
In effetti da quanto ho potuto leggere, la XmlSerializer, non puo' 
serializzare classi di cui non si ha il codice sorgente, come ad esempio 
classi (e a questo punto, interfacce, credo) contenute in dll.
C'e' un modo per aggirare l'ostacolo?
Ciao e grazie... Maurizio

Ciao vbMizio,

l'ultima cosa di cui hai bisogno sono i sorgenti per poter 
serializzare, a memoria mi sa che ï¿œ, giustamente, l'XmlSerializer che 
non sa come trattare, ri-giustamente, un'interfaccia. L'XmlSerializer 
ragiona solo su tipi pubblici concreti e non sui contratti.
Che cosa devi fare di preciso?
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

 Che cosa devi fare di preciso?
...
Uhm, piu' o meno quello che ho scritto nel mio primo post, pero' cerchero' 
di essere piu' preciso possibile.
Immaginiamo una agenda di apputamenti. La classe principale e' la classe 
Day, la quale contiene una List (Of T) dove T rappresenta la classe Hour .
Ogni istanza di Hour, che naturalmente indica un orario (09 - 10, 10 - 11 
ecc..) ha una List (Of T) dove questa volta T rappresenta la classe Meeting.
Io devo serializzare tutto il giorno, cosi' da poter esportare in formato 
XML la giornata in questione.
Fino a poco fa funzionava tutto, poi pero' per esigenze mie, la classe 
Meeting deve implementare una interfaccia definita all'interno di una dll, 
interfaccia che ha una serie di proprieta' e definisce una enumerazione.
Da notare che la classe Meeting gia' implementava una interfaccia *quasi* 
identica a quella che attualmente e' definita nella dll.
A quanto pare l'errore viene fuori quando il serializzatore tenta di 
serializzare la List (Of Meeting), dicendo che
[bla bla bla]
System.NotSupportedException: Impossibile serializzare l'interfaccia 
MyDll.iMyInterface

 interfaccia che ha una serie di proprieta' e definisce una enumerazione.
mumble mumble :-) puoi postare le definizioni delle interface, sia 
quella che funziona che quella che ti da problemi?
Valuta inoltre l'uso di un'altro motore di serializzazione come 
SoapFormatter, DataContractSerializer o lo XamlSerializer


Riciao Mauro,
le due interfacce si differenziano per la presenza, in quella che non 
funziona, della definizione di una enumerazione.
Questa e' quella che va:
Public Interface iEdit
    Property FileName() As String
    Property Duration() As Single
    Property MarkIn() As Single
    Property VolumeLevel() As Integer
    Property ByteSec() As Single
    Property OSDData() As String
    Property CheckDate() As Date
    Property GPI() As Integer
    Property GPO() As Integer
    Property SwitchPreset() As Integer
    Property SubjectName() As String
    Property SegmentNumber() As Integer
    Function WriteData() As Boolean
    Property EventType() As clsSubject.enumEventType
    Property AutoOffset() As Boolean
End Interface
Mentre quella che non va ha il seguente codice:
Public Interface iEdit
    Enum enumEventType As Integer
        Blank
        Clip
        Live
        Blink
    End Enum
    Property FileName() As String
    Property Duration() As Single
    Property MarkIn() As Single
    Property VolumeLevel() As Integer
    Property ByteSec() As Single
    Property OSDData() As String
    Property CheckDate() As Date
    Property GPI() As Integer
    Property GPO() As Integer
    Property SwitchPreset() As Integer
    Property AliasName() As String
    Property SegmentNumber() As Integer
    Function WriteData() As Boolean
    Property EventType() As enumEventType
    Property AutoOffset() As Boolean
    Property OsdDescription() As String
    Property EpisodeNumber() As Integer
    Property FullDuration() As Single
    Property SubjectID() As Integer
End Interface

Ciao vbMizio,

vedo che alcuni dei membri sono presenti in entrambe deduco che ci sia 
quindi un'implementazione esplicita e una implicita.


 quindi un'implementazione esplicita e una implicita.
...
Uhm, " e che vor di'? " :-)
all'inizio avevo solo la prima, poi ho spostato l'interfaccia nella dll e 
l'ho leggermente modificata per le nuove esigenze.
In pratica ho poco piu' che spostato l'interfaccia dal progetto alla dll.

Ciao vbMizio,

ci dici l'errore *esatto* che ottieni?
puoi postare anche il codice della classe che implementa le due 
interface e il codice che usi per serializzare/deserializzare?


 e il codice che usi per serializzare/deserializzare?
...
Postare il codice della classe mi risulta difficile, per l'errore che mi 
viene restituito.... beh, ora ho tolto quella chiamata e dovrei riandare a 
modificare.
Mi riservo pero' il diritto ( ^___^ ) di ripostare qui appena avro' modo di 
tornare alle condizioni precedenti.
Ciao e grazie ancora... Maurizio

rieccomi,
Per cio' che riguarda il codice che utilizzo per la serializzazione, eccolo 
qui:
FS = New System.IO.FileStream(strFile, IO.FileMode.Create, 
IO.FileAccess.Write)
Dim XSer As New Xml.Serialization.XmlSerializer(Me.GetType, "Container")
XSer.Serialize(FS, Me)
chiamano il metodo ToString sulla eccezione sollevata, ricevo questo:
System.InvalidOperationException: Errore nella reflection del tipo 
'OnAirPlayOut.clsDay'. ---> System.InvalidOperationException: Errore nella 
reflection della propriet 'lstContainers'. ---> 
System.InvalidOperationException: Errore nella reflection del tipo 
'OnAirPlayOut.clsDay.clsContainer'. ---> System.InvalidOperationException: 
Errore nella reflection della propriet 'lstEvents'. ---> 
System.InvalidOperationException: Errore nella reflection del tipo 
'OnAirPlayOut.clsDay.clsContainer.clsEvent'. ---> 
System.NotSupportedException: Impossibile serializzare l'interfaccia 
ClipInfoCom.iEdit.
in System.Xml.Serialization.TypeDesc.CheckSupported()
in System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo 
source, Boolean directReference, Boolean throwOnError)
in System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo 
memberInfo, Boolean directReference)
in System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo 
source, Boolean directReference, Boolean throwOnError)
in System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo 
propertyInfo)
in System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)
in 
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping 
mapping, StructModel model, Boolean openModel, String typeName, 
RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel 
model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
--- Fine dell'analisi dello stack dell'eccezione interna ---
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping 
arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, 
String arrayElementNs, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel 
model, String ns, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping 
accessor, FieldModel model, XmlAttributes a, String ns, Type 
choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel 
parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping 
mapping, StructModel model, Boolean openModel, String typeName, 
RecursionLimiter limiter)
--- Fine dell'analisi dello stack dell'eccezione interna ---
in 
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping 
mapping, StructModel model, Boolean openModel, String typeName, 
RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel 
model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
--- Fine dell'analisi dello stack dell'eccezione interna ---
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping 
arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, 
String arrayElementNs, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel 
model, String ns, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping 
accessor, FieldModel model, XmlAttributes a, String ns, Type 
choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel 
parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping 
mapping, StructModel model, Boolean openModel, String typeName, 
RecursionLimiter limiter)
--- Fine dell'analisi dello stack dell'eccezione interna ---
in 
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping 
mapping, StructModel model, Boolean openModel, String typeName, 
RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel 
model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter 
limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
--- Fine dell'analisi dello stack dell'eccezione interna ---
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
RecursionLimiter limiter)
in System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel 
model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter 
limiter)
in System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type 
type, XmlRootAttribute root, String defaultNamespace)
in System.Xml.Serialization.XmlSerializer..ctor(Type type, String 
defaultNamespace)
"Mauro Servienti [MVP]" <maurose...@online.nospam> ha scritto nel 
messaggio news:mn.39c47da7d...@online.nospam...


 ClipInfoCom.iEdit.
che cosa è lstEvents e dove è definita?
che cosa è clsEvent e dove è definita?
Perchè ti dice che è impossibile serializzare iEdit che non contiene i 
2 robi di cui sopra?
.,


 robi di cui sopra?
...
Eh, boh. che ne so :-)

 Tanto per spiegarmi meglio....
devi scoprire perchè clsEvent non è serializzabile, sembra partire da 
li il problema.
.m


 il problema.
...
Si, infatti.
clsEvent e' proprio la classe che implementa una delle due interfacce di cui 
parlavo all'inizio del thread.
Il problema, a naso, potrebbe essere la presenza di una proprieta' il cui 
tipo e' una enumerazione definita all'interno dell'interfaccia?
La sostanziale differenza tra le due interfacce e' proprio la presenza di 
questa enumerazione.

 questa enumerazione.
posta la definizione della classe clsEvent.


Qui tutte le proprieta' della classe
Public WriteOnly Property BlockOf() As String
Public ReadOnly Property Saved() As Boolean
Public Property IsTruncated() As Boolean
Public Property ContainerType() As clsContainer.enumContainerType
Public ReadOnly Property EndingAt() As Date
Public Property SubjectName() As String
Public ReadOnly Property MyColor() As Color
Public ReadOnly Property DescriptionType() As String
Public Property ID() As Integer
Public Property VolumeLevel() As Integer Implements 
ClipInfoCom.iEdit.VolumeLevel
Public Property PlanningID() As Integer
Public Property StartsAt() As Date
Public Property IsForFree() As Boolean
Public Property Verified() As Boolean
Public Property ChannelID() As Integer
Public Property FileName() As String Implements ClipInfoCom.iEdit.FileName
Public Property Duration() As Single Implements ClipInfoCom.iEdit.Duration
Public Property MarkIn() As Single Implements ClipInfoCom.iEdit.MarkIn
Public Property ByteSec() As Single Implements ClipInfoCom.iEdit.ByteSec
Public Property Position() As Integer
Public Property AutoOffset() As Boolean Implements 
ClipInfoCom.iEdit.AutoOffset
Public Property GPI() As Integer Implements ClipInfoCom.iEdit.GPI
Public Property GPO() As Integer Implements ClipInfoCom.iEdit.GPO
Public Property SwitchPreset() As Integer Implements 
ClipInfoCom.iEdit.SwitchPreset
Public Property SegmentNumber() As Integer Implements 
ClipInfoCom.iEdit.SegmentNumber
Public Property OSDData() As String Implements ClipInfoCom.iEdit.OSDData
Public Property FirstSeg() As Integer
Public Property CheckDate() As Date Implements ClipInfoCom.iEdit.CheckDate
Public Property ProgrammedDate() As Date
Public Property EventType() As ClipInfoCom.iEdit.enumEventType Implements 
ClipInfoCom.iEdit.EventType
 Come si puo' notare, l'enumerazione definita nell'interfaccia (che, 
ricordo, si trova in una dll), viene utilizzata nella proprieta' EventType

 Qui tutte le proprieta' della classe
le proprietà in sola lettura non sono serilizzabili, se provi a 
serializzare solo un'istanza di questa classe che ti dice?


> se provi a serializzare solo un'istanza di questa classe che ti dice?
Errore....
"System.InvalidOperationException: Errore nella reflection del tipo 
'OnAirPlayOut.clsDay.clsContainer.clsEvent'. ---> 
System.NotSupportedException: Impossibile serializzare l'interfaccia 
ClipInfoCom.iEdit.
in System.Xml.Serialization.TypeDesc.CheckSupported()



in System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo 
propertyInfo)
in System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)





in 
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel 
model, String ns, ImportContext context, String dataType, XmlAttributes a, 
RecursionLimiter limiter)
in System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel 
model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter 
limiter)
in System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type 
type, XmlRootAttribute root, String defaultNamespace)
in System.Xml.Serialization.XmlSerializer..ctor(Type type, String 
defaultNamespace)
in OnAirPlayOut.clsDay.clsContainer.clsEvent.WriteDataToDb() in 
h:\VB2008\Projects\VB2008\PlayOut.root\PlayOut\PlayOut\Classes\clsDay.vb:riga 
1282"

 ClipInfoCom.iEdit.
puoi postare l'intera definizione della classe incriminata e del metodo 
che usi per serializzare?
