关于序列化的问题:

冷锋 2003-05-09 10:22:58
自做的一个控件继承自Control,我在控件的前面加上了<Serializable()>,可是我在对该控件的实例进行序列化时系统出现Windows.form.control未被标记为可序列化,不知道是什么原因?

<Serializable()> Public Class MyControl : Inherits System.Windows.Forms.Control
.....
End Class


Private Sub BtnBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBegin.Click
Dim M_Control as new Mycontrol
Dim stream As Stream = File.Open("Sample.xml", FileMode.Create)
Dim formatter As New System.Runtime.Serialization.Formatters.Soap.SoapFormatter()
formatter.Serialize(stream, M_Control)'这里出问题
stream.Close()
End Sub
...全文
58 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumtec 2003-05-31
  • 打赏
  • 举报
回复
up

Sorry, I'm busy now. Can't help you
冷锋 2003-05-30
  • 打赏
  • 举报
回复
up
冷锋 2003-05-28
  • 打赏
  • 举报
回复
To Montaque(Rainman):我的控件中有Collection对象,里面有大量的对象,不可能只保存属性而不管Collection里的对象的,因为这样会丢失很多东西,这样就不可能完整再现控件。
冷锋 2003-05-28
  • 打赏
  • 举报
回复
谢谢两位版主大人先,可是我必须从Control开始继承,因为我要在上面画自己的界面呀。
UserControl我不会考虑,因为这毕竟不是做控件的主流。

2、从任意一个类开始继承,实现ISerializable接口,请问怎么实现呢?我不会呀!
Montaque 2003-05-10
  • 打赏
  • 举报
回复
Imports System.Runtime.Serialization
<Serializable()> Public Class MyControl
Inherits System.Windows.Forms.UserControl
Implements ISerializable

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'UserControl 重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意:以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(32, 24)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(152, 20)
Me.TextBox1.TabIndex = 0
Me.TextBox1.Text = "TextBox1"
'
'MyControl
'
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox1})
Me.Name = "MyControl"
Me.Size = New System.Drawing.Size(200, 72)
Me.ResumeLayout(False)

End Sub

#End Region

Private Txt As String
Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("Txt", TextBox1.Text)
End Sub
Private Sub MyControl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Public Property TextDemo() As String
Get
Return Me.TextBox1.Text
End Get
Set(ByVal Value As String)
Me.TextBox1.Text = Value
End Set
End Property
End Class
sumtec 2003-05-10
  • 打赏
  • 举报
回复
Control 本身是不能够被序列化的,因为它没有<Serializable>的标记。如果说你要求能够Serializable,那么只有两种方法:
1、从Object或者某个有<Serializable>标记的类开始继承。标记上<Serializable>
2、从任意一个类开始继承,实现ISerializable接口。
Montaque 2003-05-10
  • 打赏
  • 举报
回复
http://www.ondotnet.com/pub/a/dotnet/2002/09/09/memento.html
Montaque 2003-05-10
  • 打赏
  • 举报
回复
即使你表记了Serializable也是不可以直接序列化的。

你可以考虑这样解决,建立一个Class专门用来存取你的控件需要保存的属性,然后序列化class本身。


参考这片文章,不过是c#的,差不多。

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧