Сериализация не работает.

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

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

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сериализация не работает.

Сообщение justboy » 13.07.2006 (Чт) 19:20

Привет форумчанам.
До сих пор не могу найти ответ на вопрос о сохранении состояния формы на диск.
Все делаю в соответствии с библией http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/vbcon/html/vbwlkwalkthroughpersistingobject.asp
Результат моей попытки сохранить экземпляр формы с размещенной на ней таблицей с данными - ошибка:

An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

Additional information: Тип System.Windows.Forms.Form в сборке System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 не помечен как сериализуемый.


Скажите, я тщетно пытаюсь запихнуть форму и ее данные на диск?
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2006 (Чт) 20:44

Таким образом - да.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сообщение justboy » 13.07.2006 (Чт) 22:08

Спасибо.
А не будет ли затруднительно указать на источник решения такой задачи? :lol:
Я то на msdn надеялся... :cry:
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2006 (Чт) 22:58

А что самому в голову приходит, не позволите ли полюбопытствовать?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сообщение justboy » 14.07.2006 (Пт) 7:16

Да в голову только ругань одна приходит.

Форма ну ни чем не лучше обычного объекта. Однако объект - экземпляр собственного класса - не имеет претензии на сохранение, а форма, помеченная как "сериализабле":

Код: Выделить всё
<Serializable()> Public Class frmTableC1Form


оказывается все равно не "сериализабле".

Короче ненавижу VS.NET, но люблю больше - но это не решение. Поэтому и пришел сюда за помощью к профессорам. Тупик. :?
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.07.2006 (Пт) 8:26

наследие?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сообщение justboy » 14.07.2006 (Пт) 10:24

Так я и сохраняю наследованную форму.

Код: Выделить всё
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
<Serializable()> Public Class clsInheritTableC1Form
    Inherits RLE.frmTableC1
    Private Sub clsInheritTableC1Form_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        _FileStream = _File.Create("c:\SaveObj")
        Dim serializer As New BinaryFormatter
        serializer.Serialize(_FileStream, Me)
    End Sub
End Class


Или, постойте, вы хотите сказать создать простой класс и инхеритить в него исходный класс формы?. И этот венгрет

Код: Выделить всё
serializer.Serialize(_FileStream, Me)


и здесь ме - это невизуальный класс?
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 14.07.2006 (Пт) 12:01

а для чего всё это? Может тебе просто настройки нужно сохранить?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сообщение justboy » 14.07.2006 (Пт) 13:22

Ну так это ж святое. Разумеется, конечная цель - сохранить коллекцию свойств.
Но дело в том, что меня интересует не сама форма, а табличный компонент FlexGrid от фирмы ComponentOneStudio, размещенный на этой форме.А вот при при использовании встроенного в него метода сохранения, он не сохраняет n-ое количество свойств, т.н.:установленные типы данных в каждом столбце; имена столбцов; члены встроенного ComboList... и т.д.
Вот поэтому решился на дерзкий шаг сериализации объекта и напоролся.
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Re: Сериализация не работает.

Сообщение justboy » 14.07.2006 (Пт) 19:49

И все таки о чем же шла речь:

justboy писал(а):
An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

Additional information: Тип System.Windows.Forms.Form в сборке System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 не помечен как сериализуемый.




когда пытался сохранить экз класса - наследника искомой формы и соответственным образом помеченный.


GSerg писал(а):
Таким образом - да.



Тогда каким??? :?
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2006 (Пт) 21:35

Ручками, молодой человек. Ручками. В файлик. В текстовый, к примеру. Формата, скажем, ini хотя и не обязательно. Типа
checkbox1=true
ckeckbox2=false.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

justboy
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 13.07.2006 (Чт) 19:05
Откуда: Воронеж

Сообщение justboy » 15.07.2006 (Сб) 9:27

Ладно. Это понятно - ничего нового, ничего не изменилось.
И все таки к вопросу сериализации в принципе.
В чем же причина - чем таким отличаются формы от невизуальных кл., что их не сохранить на диск в виде потока? :?
Если транслятор не нашел ошибок в программе - обратитесь к системному программисту - он исправит ошибки в трансляторе.

Подпись в стадии отладки...
Please wait...

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

Re: Сериализация не работает.

Сообщение [WizarD]-GoSu » 08.12.2010 (Ср) 14:24

Написал две процедуры сериализация/десереализация:

Код: Выделить всё
Public Sub EXT_LOAD_XML(ByRef p_OBJECT As Object, ByVal p_PATH As String, ByVal p_TYPE As Type)
        Dim objFileStream As FileStream = New FileStream(p_PATH, FileMode.Open)
        Dim objXmlDictionaryReader As XmlDictionaryReader = XmlDictionaryReader.CreateTextReader(objFileStream, Encoding.UTF8, New XmlDictionaryReaderQuotas(), Nothing)
        Dim objSerializer As DataContractSerializer = New DataContractSerializer(p_TYPE)
        p_OBJECT = objSerializer.ReadObject(objXmlDictionaryReader, True)
        objXmlDictionaryReader.Close()
        objFileStream.Close()
    End Function

    Public Sub EXT_SAVE_XML(ByRef p_OBJECT As Object, ByVal p_PATH As String, ByVal p_TYPE As Type)
        Dim objXmlTextWriter As XmlTextWriter = New XmlTextWriter(p_PATH, Encoding.UTF8)
        objXmlTextWriter.Formatting = Formatting.Indented
        Dim objXmlDictionaryWriter As XmlDictionaryWriter = XmlDictionaryWriter.CreateDictionaryWriter(objXmlTextWriter)
        Dim objSerializer As DataContractSerializer = New DataContractSerializer(p_TYPE)
        objSerializer.WriteObject(objXmlDictionaryWriter, p_OBJECT)
        objXmlDictionaryWriter.Close()
        objXmlTextWriter.Close()
    End Sub


Далее создал класс, пометил как сериализуемый. Далее в коде:
- в первом случае передаю в кач-ве первого параметра EXT_LOAD_XML ссылку на текущий экземпляр класса, ошибок нет, но текущий экземпляр класса остаётся с теми же значениями, как до десериализации. :?
- во втором случае создаю и передаю ссылку tmpObj в кач-ве первого параметра EXT_LOAD_XML, ошибок нет, получаю экземпляр класса clsConnectionTest с данными после десериализации. :)
В чём разница между первым и вторым способом ведь в обоих случаях ссылка на один и тот же класс? :? Мне требуется инициализировать текущий экземпляр класса первым способом, т.е. нужно чтобы работало Me=objSerializer.ReadObject(objXmlDictionaryReader, True).

Код: Выделить всё
<Serializable()> Public Class clsConnectionTest
    Private Const ConfigPath As String = ".\Configs\connections_config.cfg"

    Public PingTimeout As Integer = 2000
    Public EquipmentAddresses As List(Of IPAddress) = New List(Of IPAddress)

    Public Sub Init(Optional ByVal p_CFG_PATH As String = ConfigPath)
            '1 вариант
            EXT_LOAD_XML(Me, ConfigPath, [GetType])        'Десериализация происходит правильно, ставил точки останова в EXT_LOAD_XML, но после выполнения это ф-ии, текущий экземпляр класса остаётся с теми же значениями свойств, которые были до вызова ф-ии
            '2 вариант рабочий
            Dim tmpObj As clsConnectionTest
            EXT_LOAD_XML(tmpObj, ConfigPath, [GetType])
            With tmpObj
                PingTimeout = .PingTimeout
                EquipmentAddresses = .EquipmentAddresses
            End With
    End Sub
End Class


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

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

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

    TopList