C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■102672 / 1階層)  VB6 シリアライズされたオブジェクトを VB.netで復元
□投稿者/ 魔界の仮面弁士 (3732回)-(2023/12/05(Tue) 10:24:24)
No102671 (こじま まさと さん) に返信
> デシリアライズができませんでした。
.NET 側の構造体サイズが、VB6 側のユーザー定義型サイズと異なっていますよね?

元の HP は (1 To 8) As Single の 32 バイトなのに、
.NET 側では 36 バイトで宣言されていますし。

Option Base 1 をエミュレートしたいのであれば、プロパティを自作して対応しましょう。



<Serializable>
Structure Layout
  Public FileType As String
  Public Version As String
  Public Orientation As Short
  <VBFixedArray(7)> Public _HP() As Single
  <VBFixedArray(15)> Public LV() As Short

  Public Property HP(Index As Integer) As Single
    Get
      If Index < 1 OrElse 8 < Index Then Throw New IndexOutOfRangeException()
      Return _HP(Index - 1)
    End Get
    Set(value As Single)
      If Index < 1 OrElse 8 < Index Then Throw New IndexOutOfRangeException()
      _HP(Index - 1) = value
    End Set
  End Property

  'Public Overrides Function ToString() As String
  '  Return $"FileType={FileType}, Version={Version}, Orientation={Orientation}, HP={{{String.Join(", ", Array.ConvertAll(_HP, AddressOf Convert.ToString))}}}, LV={{{String.Join(", ", Array.ConvertAll(LV, AddressOf Convert.ToString))}}}"
  'End Function
End Structure



Dim t As New Layout()
Dim fno As Integer = FreeFile()
FileOpen(fno, FileFullPath, OpenMode.Binary)
Do Until EOF(fno)
  'Option Strict Off の場合
  '
  'FileGet(fno, t)  
  '

  'Option Strict On の場合
  Dim w As ValueType = t
  FileGet(fno, w)
  t = DirectCast(w, Layout)

  'Debug.WriteLine(t)
Loop
FileClose(fno)
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←VB6 シリアライズされたオブジェクトを VB.netで復元 /こじま まさと →Re[2]: VB6 シリアライズされたオブジェクトを VB.netで復元 /こじま まさと
 
上記関連ツリー

VB6 シリアライズされたオブジェクトを VB.netで復元 / こじま まさと (23/12/05(Tue) 09:12) #102671
VB6 シリアライズされたオブジェクトを VB.netで復元 / 魔界の仮面弁士 (23/12/05(Tue) 10:24) #102672 ←Now
  └ Re[2]: VB6 シリアライズされたオブジェクトを VB.netで復元 / こじま まさと (23/12/05(Tue) 12:04) #102673 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信