1 messaggio dal 07 maggio 2007
 Grandioso!

Ecco il mio contributo per i piu` arretrati, come me, la versione vb della seconda tecnica:

Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.Serialization
Imports System.Collections.Generic
<Serializable()> _
Public Class SerializableDictionary(Of TKey, TValue)
Inherits Dictionary(Of TKey, TValue)
Implements IXmlSerializable
' Fields
Private Const NS As String = ""
Private Const XML_ITEM_NODE_NAME As String = "item"
Private Const XML_KEY_NODE_NAME As String = "key"
Private Const XML_VALUE_NODE_NAME As String = "value"

' Methods
Public Function GetSchema() As XmlSchema Implements IXmlSerializable.GetSchema
Return Nothing
End Function

Public Sub ReadXml(ByVal reader As XmlReader) Implements IXmlSerializable.ReadXml
Dim ks As New XmlSerializer(GetType(TKey))
Dim vs As New XmlSerializer(GetType(TValue))
Dim wasEmpty As Boolean = reader.IsEmptyElement
reader.Read()
If Not wasEmpty Then
Do While (reader.NodeType <> XmlNodeType.EndElement)
reader.ReadStartElement("item", "")
reader.ReadStartElement("key", "")
Dim key As TKey = DirectCast(ks.Deserialize(reader), TKey)
reader.ReadEndElement()
reader.ReadStartElement("value", "")
Dim value As TValue = DirectCast(vs.Deserialize(reader), TValue)
reader.ReadEndElement()
MyBase.Add(key, value)
reader.ReadEndElement()
reader.MoveToContent()
Loop
reader.ReadEndElement()
End If
End Sub

Public Sub WriteXml(ByVal writer As XmlWriter) Implements IXmlSerializable.WriteXml
Dim ks As New XmlSerializer(GetType(TKey))
Dim vs As New XmlSerializer(GetType(TValue))
Dim key As TKey
For Each key In MyBase.Keys
writer.WriteStartElement("item", "")
writer.WriteStartElement("key", "")
ks.Serialize(writer, key)
writer.WriteEndElement()
writer.WriteStartElement("value", "")
Dim value As TValue = MyBase.Item(key)
vs.Serialize(writer, value)
writer.WriteEndElement()
writer.WriteEndElement()
Next
End Sub

End Class

Ciao, alla prossima
Vanni
267 messaggi dal 29 settembre 2009
Ho provato ad utilizzare questo script ma ho dei problemi in lettura ...

In scrittura lo utilizzo così
 
 SerializableDictionary<string, string> dizionario = (SerializableDictionary<string, string>)Page.Session["dizionario"]; 
                using (XmlWriter writer = XmlWriter.Create(AppDomain.CurrentDomain.BaseDirectory + "/output.xml")) 
                { 
                    writer.WriteStartElement("dizionario"); 
                    dizionario.WriteXml(writer); 
                } 


Ed il file mi viene creato in modo corretto, cioè ho nella radice l'elemento <dizionario> e poi tutte le varie coppie <chiave,valore>

La lettura invece, che eseguo con il seguente codice mi da inevitabilmente errore

 
                SerializableDictionary<string, string> dizionario = new SerializableDictionary<string, string>(); 
                XmlReader reader = XmlReader.Create(AppDomain.CurrentDomain.BaseDirectory + "/output.xml"); 
                 
                if (reader != null) 
                { 
                    dizionario.ReadXml(reader); 
                    DropDownList2.DataSource = dizionario.Values; 
                    DropDownList2.DataBind(); 
                } 


Questo codice mi genera la seguente eccezione

Impossibile trovare l'elemento 'item' con il nome dello spazio dei nomi ''. Riga 1, posizione 40.

Dove sulla riga 40 cè
reader.ReadStartElement(XML_ITEM_NODE_NAME, NS);

Pensavo che l'errore fosse nella lettura della root del file xml ma nn ne riesco proprio a venirne a capo :(
Modificato da claudio_dg il 22 marzo 2010 22.32 -
Scusa ma perché non utilizzi direttamente il serializzatore Xml del framework (System.Xml.Serialization.XmlSerializer)?

Matteo Casati
GURU4.net
267 messaggi dal 29 settembre 2009
Grazie per la dritta

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.