2013-04-03 4 views
0

Я начал программировать в компании, где программа была написана в VB. Я преобразовал его в C#, потому что это гораздо более чистый код.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 в строку-Вар, конечно, запрещено. Я написал класс в C#, который называется Class1Old, который включает в себя все члены, объявленные в VB, , но когда я десериализую C#, я поймаю исключение «String не может быть преобразован в Boolean».

Я наблюдал в письменном * .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 значения преобразуются и переделаны.

Как я могу десериализовать файл на C#, который был написан с VB?

надежда кто-то может мне помочь ...

EDIT:

Теперь я включаю 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 проекта.

Так что же причиной этого исключения?

приветствует Хенрик

ответ

3

Уступка BOOL к строковой переменной также запрещенный в VB.net - если ваш предшественник не использовал Option Strict On. В этом случае ваш C# rant имеет смысл - практика кодирования виновата, а не VB.Net.

Существует нелегкий способ десериализации класса - я думаю, что лучшим способом будет Bool Properties, который при установке также создает строковые переменные. Это будет работать с xml serialiazation, я не уверен, что если он работает с бинарным форматированием.

0

Если вы настаиваете на «исправлении» чего-то, что не нарушено, я полагаю, вам нужно будет десериализоваться в промежуточный класс «перевод», который имеет список, определенный как Object или Boolean. Затем этот класс выведет объект Class1.

Смежные вопросы