注册 登录
编程论坛 VB.NET论坛

VB.net序列化问题

xiangyue0510 发布于 2016-05-24 09:52, 4673 次点击
这个是我在对TV3D模型进行序列化时发生的错误。哪位大牛遇到过,请帮助解决一下。
程序集“mscorlib,Version=4.0.0.0,Culture=neutral, PublicKeyToken=b77a5c561934e089”中的类型System._ComObject未标记为可序列化

模型结构声明
程序代码:

Module ModuleTV3DModel
    <Serializable()> Public Structure TV3D_Model
        Public ModelName As String

        'TV3D构件对象(数组)
        Public MB_L() As Member_L
        Public MB_C() As Member_C
        Public MB_H() As Member_H
        Public MB_T() As Member_T
        Public MB_Tube() As Member_Tube

        Public MB_Shell() As ShellMember 'TV3D板壳对象(数组)
        Public MB_Joints() As Member_Joint  'TV3D节点对象(数组)
    End Structure
End Module


子结构声明,都类似所以就给了一个
程序代码:
Module ModuleTube
    <Serializable()> Public Structure Member_Tube
        Dim M_Name As String   '构件名称
        Dim SectName As String      '构件截面名称
……
        '下面还有这个结构的一些函数



主窗口代码,打开模型按钮还做(目前是从数据库打开,没有序列化),保存按钮出问题
程序代码:

    Shared myModel(0) As TV3D_Model
     ……

    Private Sub ToolStripButtonSaveModel_Click(sender As Object, e As EventArgs) Handles ToolStripButtonSaveModel.Click
        Dim fStream As New FileStream(Application.StartupPath & "\1.smd", FileMode.Create)
        Dim bf As New BinaryFormatter
        bf.Serialize(fStream, myModel)
        fStream.Close()
    End Sub


3 回复
#2
不说也罢2016-05-24 11:07
对象的序列化的实现,首先要保证该对象可以序列化。而且,序列化只是将对象的属性进行有效的保存,对于对象的一些方法则无法实现序列化的。
对TV3D模型不是太了解,帮你顶下。
        Dim TestModel As New TV3D_Model
        Dim fStream As New FileStream(Application.StartupPath & "\1.smd", FileMode.Create,FileAccess.Write, FileShare.None)
        Dim bf As New BinaryFormatter
        bf.Serialize(fStream, TestModel)
        fStream.Close()
#3
xiangyue05102016-05-24 12:52
谢谢,版主。
这个TV3D应该是可以序列化的,官方是有例子的。http://wiki. 最下面就是VB的Code,但是太简单了。
现在就是搞不清楚是什么原因造成报错。
希望有高手弄过,给指点一下。
不行只能先回到最简单的例子,我现在的程序已经成型,再来改确实可能出现问题。
#4
xiangyue05102016-05-24 14:40
回复 2楼 不说也罢
你说的很对,我研究了官方的例子,它序列化的也是基本的数据类型。
所以我做了一个很简单的例子测试
下面的代码是可以执行的,但是如果把Mesh放在Ball的结构中就会出现1楼这样的问题
程序代码:

Option Explicit On
Imports TV3D65
Imports Imports System.Data
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary

Public Class Form1
    <Serializable()> Public Structure Ball   '这句前的 <Serializable()>必须用,否则会标记为“未标记为可序列化”
        Public X, Y, Z As Single
        Public R As Single
    End Structure

    Dim Tv As New TVEngine '调用tv3d所必需的
    Dim Scene As New TVScene '调用tv3d所必需的
    Dim myball As Ball
    Dim Mesh As TVMesh

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Show() '显示当前窗口,每次都加上错不了
        myball.X = 0
        myball.Y = 0
        myball.Z = 10
        myball.R = 2

    End Sub

    Private Sub ButtonSave_Click(sender As Object, e As EventArgs) Handles ButtonSave.Click
        myball.X = CSng(TextBoxX.Text)
        myball.Y = CSng(TextBoxY.Text)
        myball.Z = CSng(TextBoxZ.Text)
        myball.R = CSng(TextBoxR.Text)

        Dim fStream As New FileStream(Application.StartupPath & "\1.smd", FileMode.Create)
        Dim bf As New BinaryFormatter
        bf.Serialize(fStream, myball)
        fStream.Close()
        MsgBox("Done!"
    End Sub

    Private Sub ButtonLoad_Click(sender As Object, e As EventArgs) Handles ButtonSave.Click
        Tv.Init3DWindowed(PictureBox1.Handle, True'将当前窗口的句柄传递给TV3D,用窗口模式启动tv3d
        Tv.SetVSync(True)
        Tv.DisplayFPS(False

        Dim fStream As New FileStream(Application.StartupPath & "\1.smd", FileMode.Open)
        Dim sfFormatter As New BinaryFormatter
        'Erase myball  '将当前的数组清空,
        '如用新的数组,如 Dim num1() as StockPara  则需要明确定义类型否则报错“无法将类型*** 转换为类型***”
        'MsgBox(IsNothing(PP))   '检查数组是否清空,调试时使用
        myball = sfFormatter.Deserialize(fStream)
        fStream.Close()


        Mesh = Scene.CreateMeshBuilder
        Mesh.SetPosition(myball.X, myball.Y, myball.Z)
        '************************  创建型钢的代码,需要修改 **************************
        Mesh.CreateSphere(myball.R, 12, 12)
        Do '主循环  
            Tv.Clear() '清屏
            Mesh.Render() '渲染茶壶   
            Tv.RenderToScreen() '把所得最终结果渲染到屏幕  
            Application.DoEvents() '这句是把线程空出来,使其他的的程序能运行,必加
        Loop
    End Sub
End Class
1