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# 中,当然禁止将 bool 分配给 String-Var。我在 C# 中编写了一个名为 Class1Old 的类,其中包括在 VB 中声明的所有成员,但是当我在 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# 文件?

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

编辑:

现在我在我的 ptoject 中包含一个 VB dll 项目,包括“旧”代码。我的 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

在 VB.net 中也禁止将布尔值分配给字符串变量 - 除非您的前任没有使用 Option Strict On。在那种情况下,您的 C# 咆哮是有意义的 - 编码实践有问题,而不是 VB.Net。

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

于 2013-04-03T11:41:40.563 回答
0

如果您坚持“修复”没有损坏的东西,我想您需要反序列化为一个中间“翻译”类,该类将列表定义为对象或布尔值。然后这个类将输出一个 Class1 对象。

于 2013-04-03T11:46:17.497 回答