Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: сериализация класса, с полем as image Добавлено: 22.08.11 17:47  

Автор вопроса:  DimBi
Если инициирую экземпляр класса вот так:

Dim newRecord As myRecord
newRecord = New myBook.myRecord(TxtName.Text, TxtPhone.Text, TxtAddress.Text, System.Drawing.Image.FromFile("C:\fototest\hrist.jpg"))
newBook.AddRecord(newRecord)

Сериализация и обратно - проходят отлично.
Но мне надо сохранить image загруженный в picturebox.
пробовал так:

Dim newRecord As myRecord
Dim newImage As Image = PictureBoxFoto.Image
newRecord = New myBook.myRecord(TxtName.Text, TxtPhone.Text, TxtAddress.Text, newImage)
        newBook.AddRecord(newRecord)

 - не получается...
Класс инициируется без проблем, а во время сериализации возникает ошибка:
В GDI+ возникла ошибка общего вида.


где я ошибаюсь? Как исправить?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 DimBi



Вопросов: 15
Ответов: 55
 Профиль | | #1 Добавлено: 22.08.11 23:53
... решил по другому:
  1. Dim newRecord As myRecord
  2.         Dim openFileDialog1 As New OpenFileDialog()
  3.  
  4.         openFileDialog1.InitialDirectory = "c:\Users\Dmitriy\Pictures"
  5.         openFileDialog1.Filter = "image files (*.jpg)|*.jpg|All files (*.*)|*.*"
  6.         openFileDialog1.FilterIndex = 2
  7.         openFileDialog1.RestoreDirectory = True
  8.  
  9.         If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
  10.             Try
  11.                 newRecord = New myBook.myRecord(TxtName.Text, TxtPhone.Text, TxtAddress.Text, System.Drawing.Image.FromFile(openFileDialog1.FileName))
  12.                 newBook.AddRecord(newRecord)
  13.                 PictureBoxFoto.Image = CType(newBook.ThisBook.Item(newBook.ThisBook.Count - 1), myRecord).Photo
  14.             Catch Ex As Exception
  15.                 MessageBox.Show("Cannot read file from disk. Original error: " & Ex.Message)
  16.             End Try
  17.         End If

Теперь последующая сериализация успешна.

Так и не понял, почему image не сериализуется, если брать его напрямую из picturebox?

сериализовал так:
  1. Public Sub Save(ByVal fileName As String)
  2.         Dim fs As New FileStream(fileName, FileMode.OpenOrCreate)
  3.         Dim bf As New BinaryFormatter()
  4.             bf.Serialize(fs, ThisBook)
  5.             fs.Close()
  6.             bf = Nothing
  7.             End Sub

Ответить

Номер ответа: 2
Автор ответа:
 DimBi



Вопросов: 15
Ответов: 55
 Профиль | | #2 Добавлено: 26.08.11 21:27
Разобрался!
В сериализованном классе обязательно должен быть открытый конструктор без параметров:
  1. Public Sub New()
  2.         End Sub

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 27.08.11 01:27
А при чем тут тогда ошибка GDI+ общего вида?
Я похожую ошибку получал когда пытался сохранить jpeg в поток, не поддерживающий операцию seek.

Ответить

Номер ответа: 4
Автор ответа:
 DimBi



Вопросов: 15
Ответов: 55
 Профиль | | #4 Добавлено: 27.08.11 12:48
А при чем тут тогда ошибка GDI+ общего вида?

Вот этого я не знаю...
В моем классе был конструктор с параметрами и не было конструктора без параметров.
Сначала я не обратил на это внимания и image не хотел сериализоваться.
Написал сюда, но никто не ответил.
В MSDN http://msdn.microsoft.com/ru-ru/library/ms172872.aspx про чтетие из XML-файла,
нашел вот что:
Исключение может появиться при следующих условиях.
В сериализованном классе нет открытого конструктора без параметров.
Данные в файле не являются данными из класса, который был десериализован.
Файл не существует (IOException).

Решил попробовать добавить конструктор без параметров... И получилось!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам