Сериализация HashTable

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сериализация HashTable

Сообщение baha76 » 23.02.2006 (Чт) 12:51

Есть класс унаследованный от HashTable, и при сериализации появляется исключение (на строке обявления переменной ser).
Код: Выделить всё
    Public Shared Sub Save(ByVal path As String, _
    ByVal value As clsContactsCollection)
        Dim ser As New XmlSerializer(GetType(clsContactsCollection))
        Dim writer As New StreamWriter(path)
        ser.Serialize(writer, value)
        writer.Close()
    End Sub

Хотя за основу взял пример из MSDN 2005.
Кто сталкивался с такой проблемой, помогите плиз...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.02.2006 (Чт) 14:10

прежде всего: какая версия VS?
Изображение

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 23.02.2006 (Чт) 14:42

VB 2005 Professional

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 23.02.2006 (Чт) 16:16

baha76
Какое исключение?

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 24.02.2006 (Пт) 8:13

Суть проблемы такова:
Есть свой класс с кучами свойств, т.е. собственный объект.
Этот заполненный объект добавляю в класс, который унаследован от HashTable и потом хочу сериализовать.
1. Если использовать SoapFormatter, то процесс сериализации происходит нормально. Но во время десериализации среда ругается, что не может найти конструктор.
2. Если использовать XMLSerializer, то в момент обявления переменной выходит такая ошибка:
    The type XMLSerialization.clsContactsCollection is not supported because it implements IDictionary.

Для меня решение проблемы принципиальна, т.к. это в образовательных целях.
У меня есть обходные пути, т.е. я могу сериализовать объект не используя унаследование, а объявляя переменную как HashTable.

[WizarD]-GoSu
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 08.10.2006 (Вс) 15:31
Откуда: Russia

Re: Сериализация HashTable

Сообщение [WizarD]-GoSu » 12.11.2008 (Ср) 13:39

Всем привет!!! :D Я тоже столкнулся с проблемой при сериализации HashTable в VB .NET 2005. Суть проблемы в следующем:

Чтобы Hashtable сериализовался созздаём на его основе класс:

Код: Выделить всё
Public Class clsSHashtable
    Inherits Hashtable
    Implements IXmlSerializable

    Public Sub Serialize(ByVal stream As Stream, ByVal obj As clsSHashtable)
        Dim xs As XmlSerializer = New XmlSerializer(MyClass.GetType)
        xs.Serialize(stream, obj)
    End Sub

    Public Function Deserialize(ByVal stream As Stream) As IDictionary

        Dim xs As XmlSerializer = New XmlSerializer(MyClass.GetType)
        Dim ds As clsSHashtable = CType(xs.Deserialize(stream), clsSHashtable)
        Return ds
    End Function

    Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
        Return Nothing
    End Function

    Sub ReadXml(ByVal reader As XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
        reader.Read()
        Do While (reader.NodeType <> XmlNodeType.EndElement)

            reader.ReadStartElement("item")
            Dim key As String = reader.ReadElementString("key")
            Dim value As String = reader.ReadElementString("value")
            reader.ReadEndElement()
            reader.MoveToContent()
            MyClass.Add(key, value)
        Loop
    End Sub

    Private Sub WriteXml(ByVal writer As XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml

        For Each key As Object In MyClass.Keys
            Dim value As Object = MyClass.Item(key)
            writer.WriteStartElement("item")
            writer.WriteElementString("key", key.ToString())
            writer.WriteElementString("value", value.ToString())
            writer.WriteEndElement()
        Next
    End Sub

End Class


Для сериализации используем функцию GET_XML, а для десериализации GET_OBJECT

Код: Выделить всё
    Public Function GET_XML(ByRef p_OBJECT As Object) As String
        If p_OBJECT Is Nothing Then
            Return ""
        Else
            Dim objSerializer As New Serialization.XmlSerializer(p_OBJECT.GetType)
            Dim objStringWriter As New StringWriter
            objSerializer.Serialize(objStringWriter, p_OBJECT)
            Return objStringWriter.ToString
        End If
    End Function

    Public Sub GET_OBJECT(ByRef p_RET_OBJECT As Object, ByVal p_XML As String)
        Dim objSerializer As New Serialization.XmlSerializer(p_RET_OBJECT.GetType)
        Dim objStringReader As New System.IO.StringReader(p_XML)
        p_RET_OBJECT = objSerializer.Deserialize(objStringReader)
    End Sub


Теперь создадим объект класа clsSHashtable и добавим в него два объекта структуры u_ERROR.

Код: Выделить всё
Public Module modErrorReactor

Private Errors_Table As New clsSHashtable

Public Structure u_ERROR
        Public MESSAGE As String
        Public TITLE As String
        Public BUTTONS As String
        Public ICON As String
End Structure

Public Sub MySub()
        Dim Err1, Err2 As u_ERROR
        With Err1
            .MESSAGE = "File not found!"
            .TITLE = "Error!"
            .BUTTONS = "5"
            .ICON = "16"
        End With
        With Err2
            .MESSAGE = "Файл не найден!"
            .TITLE = "Ошибка!"
            .BUTTONS = "5"
            .ICON = "16"
        End With

        Errors_Table.Add("0", Err1)
        Errors_Table.Add("200", Err2)

        MessageBox.Show(GET_XML(Errors_Table))
End sub
End Module


MessageBox выдал:

Код: Выделить всё
<?xml version="1.0" encoding="utf-16"?>
<clsSHashtable>
  <item>
    <key>200</key>
    <value>user.modErrorReactor+u_ERROR</value>
  </item>
  <item>
    <key>0</key>
    <value>user.modErrorReactor+u_ERROR</value>
  </item>
</clsSHashtable>


Вопрос, что нужно изменить в методах clsSHashtable, чтобы объект u_ERROR, добавленный в clsSHashTable, тоже сериализовался и десериализовался. :?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89

    TopList