首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建材质库

创建材质库
EN

Stack Overflow用户
提问于 2021-03-03 21:01:16
回答 1查看 28关注 0票数 0

我正在开发一个小应用程序(用VB.net编写),用于计算结构的一些力学属性。为此,我需要一个具有一些材料属性的库。我只是将编程作为一种爱好,所以我还远不熟悉这门语言的所有可能性。

我有几个想法:创建一个数组,例如:

代码语言:javascript
复制
Public Shared arrMaterials(,) As String =
        New String(,) {{"S235JR", "210000", "235", "360"},
                       {"S355JR", "210000", "355", "490"},

将我的材料放入XML中并读取所需的属性。

然而,我想知道是否(以及如何)可以创建一个带有属性的自定义对象的库。

是不是就像这样简单:

代码语言:javascript
复制
Dim Material0 As New Material
With Material0
    .MaterialName = "S235JR"
    .Young-modulus = "210000"
    .YieldStrength = "235"
    .TensileStrength = "360"
End With

还是我错过了什么?有没有人能把我推向正确的方向?

EN

回答 1

Stack Overflow用户

发布于 2021-03-04 14:39:07

下面的代码演示了如何使用类来获得正确的XML结构。本文还展示了如何将数据序列化(到XML文件)和如何反序列化XML (从XML文件加载数据)。

新建Windows窗体项目

添加引用:System.Runtime.Serialization

在VS菜单中,单击Project

  • Select

添加引用:System.Xml

在VS菜单中,单击Project

  • Select

创建两个保存数据的类。添加构造函数以使添加数据变得更容易。

添加类:XmlMaterial

在VS菜单中,单击Project

  • Select
  • 添加类...(名称: XmlMaterial.vb)
  • Click OK

XmlMaterial.vb

代码语言:javascript
复制
Imports System.Runtime.Serialization

<DataContract(Name:="Material")>
Public Class XmlMaterial

    <DataMember(Name:="MaterialName")>
    Public Property MaterialName As String

    <DataMember(Name:="TensileStrength")>
    Public Property TensileStrength As Integer

    <DataMember(Name:="YoungModulus")>
    Public Property YoungModulus As Integer

    <DataMember(Name:="YieldStrength")>
    Public Property YieldStrength As Integer


    Public Sub New()

    End Sub

    Public Sub New(ByVal materialName As String, ByVal youngModulus As Integer, ByVal YieldStrength As Integer, ByVal tensilStrength As Integer)
        Me.MaterialName = materialName
        Me.YoungModulus = youngModulus
        Me.YieldStrength = YieldStrength
        Me.TensileStrength = tensilStrength
    End Sub

End Class

为了使XML文件具有正确的结构,请创建另一个包含XmlMaterial列表的类。添加一个方法(AddMaterial)以使添加数据变得更容易。

添加类:XmlRoot

在VS菜单中,单击Project

  • Select
  • 添加类...(名称: XmlRoot.vb)
  • Click OK

XmlRoot.vb

代码语言:javascript
复制
Imports System.Runtime.Serialization

<DataContract(Name:="Root")>
Public Class XmlRoot

    <DataMember(Name:="Materials")>
    Public Property Materials As New List(Of XmlMaterial)

    Public Sub AddMaterial(ByVal materialName As String, ByVal youngModulus As Integer, ByVal yieldStrength As Integer, ByVal tensilStrength As Integer)
        Materials.Add(New XmlMaterial(materialName, youngModulus, yieldStrength, tensilStrength))
    End Sub
End Class

添加模块:HelperSerialization

在VS菜单中,单击Project

  • Select
  • 添加模块...(名称: HelperSerialization.vb)
  • Click OK

"HelperSerialization.vb“中的代码用于写入XML文件(序列化)和从XML文件读取数据(反序列化)。

HelperSerialization.vb

代码语言:javascript
复制
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Xml

Module HelperSerialization

    Public Function DeserializeXml(Of T)(ByVal filename As String) As T
        Dim result As T = CType(Nothing, T)

        If String.IsNullOrEmpty(filename) Then
            Debug.WriteLine("Error: Filename is null or empty")
            Return result
        End If

        Try
            'create new instance
            Dim mySerializer As New DataContractSerializer(GetType(T))

            'read XML file
            Using fs As FileStream = New FileStream(filename, FileMode.Open)
                Using reader As XmlReader = XmlReader.Create(fs)
                    Return mySerializer.ReadObject(reader)
                End Using
            End Using

        Catch ex As System.Runtime.Serialization.SerializationException
            Debug.WriteLine("Error (DeserializeXml - SerializationException) - " & ex.Message)
        Catch ex As Exception
            Debug.WriteLine("Error (DeserializeXml) - " & ex.Message)
        End Try

    End Function

    Public Sub SerializeToXmlFile(ByVal filename As String, ByVal xmlObject As Object)

        If String.IsNullOrEmpty(filename) Then
            Debug.WriteLine("Error: Filename is null or empty")
            Return
        End If

        Try
            'create new instance
            Dim mySerializer As New DataContractSerializer(xmlObject.GetType())

            Dim myXmlWriterSettings As New XmlWriterSettings
            With myXmlWriterSettings
                .OmitXmlDeclaration = False
                .Encoding = System.Text.Encoding.UTF8
                .Indent = True
            End With

            'write to XML file
            Using myXmlWriter As XmlWriter = XmlWriter.Create(filename, myXmlWriterSettings)

                'serialize 
                mySerializer.WriteObject(myXmlWriter, xmlObject)
            End Using

        Catch ex As System.Runtime.Serialization.SerializationException
            Debug.WriteLine("Error (SerializeToXmlFile - SerializationException) - " & ex.Message)
        Catch ex As Exception
            Debug.WriteLine("Error (SerializeToXmlFile) - " & ex.Message)
        End Try
    End Sub

End Module

在VS菜单中,单击View

  • Select
  • 解决方案资源管理器,右键单击View
  • Select
    • Designer

表单的添加按钮(名称: btnSave)

在VS菜单中,单击View

  • Select Toolbox

  • Click Button

  • Click on
  • 将该按钮添加到form

表单的添加按钮(名称: btnLoad)

在VS菜单中,单击View

  • Select Toolbox

  • Click Button

  • Click on
  • 将该按钮添加到form

备注:双击每个按钮以创建单击处理程序

在解决方案资源管理器中,右键单击Form1.vb

  • Select
  • 查看Code

Form1.vb

代码语言:javascript
复制
Public Class Form1

    Private ConstructionMaterials As New XmlRoot
    Private filename As String = System.IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "materials.xml")


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        CreateTestData()
    End Sub

    Private Sub CreateTestData()
        ConstructionMaterials.AddMaterial("S235JR", "210000", "235", "360")
        ConstructionMaterials.AddMaterial("S123JR", "200000", "212", "300")
    End Sub

    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
        'serialize - write to file
        SerializeToXmlFile(filename, ConstructionMaterials)

        Debug.WriteLine("Data saved to: " & filename)
    End Sub

    Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click

        'deserialize - read from file
        ConstructionMaterials = DeserializeXml(Of XmlRoot)(filename)

        If ConstructionMaterials IsNot Nothing AndAlso ConstructionMaterials.Materials.Count > 0 Then
            Debug.WriteLine("Data read from: " & filename)
        End If

        If ConstructionMaterials IsNot Nothing Then
            For i As Integer = 0 To ConstructionMaterials.Materials.Count - 1
                Debug.WriteLine(ConstructionMaterials.Materials(i).MaterialName & " " & ConstructionMaterials.Materials(i).TensileStrength)
            Next
        End If

    End Sub
End Class

上面的代码将创建以下XML文件。

materials.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MaterialProject">
  <Materials>
    <Material>
      <MaterialName>S235JR</MaterialName>
      <TensileStrength>360</TensileStrength>
      <YieldStrength>235</YieldStrength>
      <YoungModulus>210000</YoungModulus>
    </Material>
    <Material>
      <MaterialName>S123JR</MaterialName>
      <TensileStrength>300</TensileStrength>
      <YieldStrength>212</YieldStrength>
      <YoungModulus>200000</YoungModulus>
    </Material>
  </Materials>
</Root>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66457630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档