Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Запись всех полей класса в файл Добавлено: 09.06.09 12:32  

Автор вопроса:  FIX | ICQ: 348680795 
Здарствуйте. Есть класс

Imports System.Runtime.InteropServices

Public Module Types

    <StructLayout(LayoutKind.Explicit, Pack:=1, Size:=528)> _
    Public Class Element
        <FieldOffset(0)> <VBFixedString(16)> Public Name As String
        <FieldOffset(16)> <VBFixedString(512)> Public Path As String
        <FieldOffset(0)> Public AllData(527) As Byte

        Public Sub New()
            'Name = ""
            'Path = ""
            'AllData = ""
        End Sub

    End Class

End Module


и код формы


Imports System.Runtime.InteropServices

Public Module Types

    <StructLayout(LayoutKind.Explicit, Pack:=1, Size:=528)> _
    Public Class Element
        <FieldOffset(0)> <VBFixedString(16)> Public Name As String
        <FieldOffset(16)> <VBFixedString(512)> Public Path As String
        <FieldOffset(0)> Public AllData(527) As Byte

        Public Sub New()
            'Name = ""
            'Path = ""
            'AllData = ""
        End Sub

    End Class

End Module


я хочу посредством
<FieldOffset(0)>
сделать объединение AllData, при помощи которого и записать все данные не перебирая поле за полем, но в файл сохраняются не все данные.
1) В чем ошибка?
2) Помогите реализовать задумку

Ответить

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

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



ICQ: 348680795 

Вопросов: 39
Ответов: 62
 Профиль | | #1 Добавлено: 09.06.09 12:35
упс. Вот код формы

Public Class Form1

    Public elements As New List(Of Element)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'dim c as
        elements.Add(New Element())
        elements(0).Name = "---Fix---"
        elements(0).Path = "c:\Program files\VBNET\"
        TextBox1.Text = elements(0).Name
        TextBox2.Text = elements(0).Path
        TextBox3.Text = System.Text.Encoding.ASCII.GetString(elements(0).AllData)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim fs As New System.IO.FileStream("MyFile.txt", IO.FileMode.Create)
        fs.Write(elements(0).AllData, 0, elements(0).AllData.Length)
        fs.Close()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim fs As New System.IO.FileStream("MyFile.txt", IO.FileMode.Open)
        fs.Read(elements(0).AllData, 0, FileLen("MyFile.txt";))
        fs.Close()
        TextBox1.Text = elements(0).Name
        TextBox2.Text = elements(0).Path
        TextBox3.Text = elements(0).AllData.ToString
    End Sub
End Class

Ответить

Номер ответа: 2
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #2
Добавлено: 09.06.09 17:08
в дотнете нету сериализации?

Ответить

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



ICQ: 348680795 

Вопросов: 39
Ответов: 62
 Профиль | | #3 Добавлено: 09.06.09 18:33
Спасибо попробую

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 10.06.09 21:20
  1.     Public Shared Function ToArray(Of T)(ByVal data As T) As Byte()
  2.         Dim Size = Marshal.SizeOf(data)
  3.         Dim Buff(Size - 1) As Byte
  4.  
  5.         Dim Handle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
  6.         Marshal.StructureToPtr(data, Handle.AddrOfPinnedObject, False)
  7.         Handle.Free()
  8.  
  9.         Return Buff
  10.     End Function
  11.  
  12.     Public Shared Function ToStructure(Of T As New)(ByVal data As Byte()) As T
  13.         If Marshal.SizeOf(GetType(T)) <> data.Length Then
  14.             Throw New Exception("Size mismatch")
  15.         End If
  16.  
  17.         Dim Result = New T
  18.         Dim Handle = GCHandle.Alloc(data, GCHandleType.Pinned)
  19.         Marshal.PtrToStructure(Handle.AddrOfPinnedObject, Result)
  20.         Handle.Free()
  21.  
  22.         Return Result
  23.     End Function


Но я бы все-таки советовал XML сериализацию или что-то в этом роде, тк это слишком хардкорный метод

Ответить

Страница: 1 |

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



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