VB序列化到C#序列化

时间:2013-04-03 11:28:23

标签: c# vb.net serialization

我开始在公司编程,其中程序是用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#中,当然禁止将bool赋值给String-Var。 我在C#中编写了一个名为Class1Old的类,其中包含VB中声明的所有成员, 但是当我在C#中反序列化时,我捕获了异常&#34;字符串无法转换为布尔值&#34;。

我在写的* .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                     

我无法想象theese 7值如何被转换和重新转换。

如何在用VB编写的C#中反序列化文件?

希望有人可以帮助我...

编辑:

现在我将一个VB dll项目包含在我的ptoject中,其中包括&#34; old&#34;码。 我的C#-code调用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项目中的类型相同。

那么什么是导致异常的?

招呼 亨利克

2 个答案:

答案 0 :(得分:3)

在VB.net中也禁止将bool分配给字符串变量 - 除非您的前任未使用Option Strict On。在那种情况下,你的C#咆哮是意义上的 - 编码实践是错误的,而不是VB.Net。

没有简单的方法来反序列化类 - 我认为最好的方法是Bool Properties,它在设置时也会创建字符串变量。 这适用于xml序列化,我不确定它是否适用于二进制格式化程序。

答案 1 :(得分:0)

如果你坚持“修复”没有破坏的东西,我想你需要反序列化为一个中间的“翻译”类,它具有定义为Object或Boolean的列表。然后该类将输出一个Class1对象。