プログラムがVBで書かれている会社でプログラミングを始めました。C# に変換したのは、よりクリーンなコードだからです。
VBでは、彼らはそのようなことをしました:
Class Program
Friend Shared Sub Main(args As String())
Dim obj As New Class1()
Dim fs As New System.IO.FileStream("test.txt", System.IO.FileMode.OpenOrCreate)
Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(fs, obj)
fs.Close()
fs = New System.IO.FileStream("test.txt", System.IO.FileMode.OpenOrCreate)
bf = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
obj = bf.Deserialize(fs)
For Each item As String In obj.myList
Console.WriteLine(item)
Next
Console.Read()
End Sub
End Class
<Serializable> _
Class Class1
Public myList As List(Of String)
Public Sub New()
myList = New List(Of String)()
myList.Add(True)
myList.Add(False)
myList.Add(True)
myList.Add(False)
myList.Add(True)
myList.Add(False)
myList.Add(True)
End Sub
End Class
しかし、C# ではもちろん、String-Var への bool の代入は禁止されています。VB で宣言されているすべてのメンバーを含む Class1Old という名前のクラスを C# で作成しましたが、C# で逆シリアル化すると、「文字列をブール値に変換できません」という例外が発生します。
書き込まれた *.txt ファイルを見てみましたが、結果は非常にわかりにくいものでした:
ÿÿÿÿ JConsoleApplication1, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null
ConsoleApplication1.Class1
myListSystem.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
_items_size_version True False
これらの 7 つの値がどのように変換され、再変換されるのか想像できません。
VB から作成された C# ファイルをデシリアライズするにはどうすればよいですか?
誰かが私を助けてくれることを願っています...
編集:
ここで、「古い」コードを含む VB dll プロジェクトを ptoject に含めます。私の C# コードは、逆シリアル化を開始する VB コードのメソッドを呼び出します。しかし、私はまだ ArgumentException を受け取ります:
The object of type "System.Collections.Generic.List`1[System.String]" can not be converted to type "System.Collections.Generic.List`1[System.Boolean]".
ただし、シリアル化されたクラスのすべての引数は、実際のプロジェクトと純粋な VB プロジェクトの同じ型です。
では、その例外の原因は何ですか??
ヘンリックに挨拶