0

プログラムが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 プロジェクトの同じ型です。

では、その例外の原因は何ですか??

ヘンリックに挨拶

4

2 に答える 2

3

前任者が Option Strict On を使用していない場合を除き、文字列変数への bool の代入も VB.net では禁止されています。その場合、あなたの C# の暴言は意味があります。VB.Net ではなく、コーディングの慣行に問題がありました。

クラスを逆シリアル化する簡単な方法はありません。設定時に文字列変数も作成する Bool プロパティが最適な方法だと思います。これは xml シリアライゼーションで動作しますが、バイナリ フォーマッタで動作するかどうかはわかりません。

于 2013-04-03T11:41:40.563 に答える
0

壊れていないものを「修正」することを主張する場合は、オブジェクトまたはブールとして定義されたリストを持つ中間の「変換」クラスに逆シリアル化する必要があると思います。このクラスは Class1 オブジェクトを出力します。

于 2013-04-03T11:46:17.497 に答える