2015-05-08 10 views
5

Mam problem pobierania danych z klasy serialized C# array z python. Mam dwa pliki zawierające te klasy. Pierwszy jestem w stanie zapętlić tablicę i pobrać zmienne publiczne. Jednak w drugim pliku widzę klasę, ale nie mam dostępu do żadnej ze zmiennych. Minęło ponad 10 lat, odkąd użyłem C# i uderzałem głową o komputer. Jedyną różnicą jaką widzę jest plik1.bin używa String gdzie plik2.bin używa łańcucha. Wszelkie wskazówki byłyby przydatne.python otwórz zserializowany plik C#

ironpython używany do odczytu plików .bin.

from System.Runtime.Serialization.Formatters.Binary import BinaryFormatter 
from System.IO import FileStream, FileMode, FileAccess, FileShare 
from System.Collections.Generic import * 

def read(name): 
    bformatter = BinaryFormatter() 
    file_stream = FileStream(name, FileMode.Open, FileAccess.Read,   FileShare.Read) 
    res = bformatter.Deserialize(file_stream) 
    file_stream.Close() 
    return res 

def write(name,data): 
    bformatter = BinaryFormatter() 
    stream = FileStream(name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite) 
    bformatter.Serialize(stream, data) 
    stream.Close() 

res = read('fiel2.bin') 
for space in res: 
    print dir(space) 

File1.bin - (uproszczony) tablica Resident - mają dostęp do danych

namespace RanchoCSharp 
{ 
    [Serializable] 
    public class Resident 
    { 
     public Resident() 
     { 
     } 
     public Resident(String fName, String lName) 
     { 
      firstN = fName; 
      lastN = lName; 
     } 
     //Invoice info 
     public String firstN; 
     public String lastN; 
    } 
} 

file2.bin (uproszczony) Array Resident informacji nie ma dostępu do danych

namespace Rancho_Resident 
{ 
    [Serializable] 
    class ResidentInfo 
    { 
     public ResidentInfo() 
     { 
     } 
     public string unit; 
     public string space; 
    } 
} 

aktualizacja

Po przyjrzeniu się bliżej wydaje się, że jeden clas s jest publiczne, a drugie jest wewnętrzne. Jednak nie jestem pewien, jak uzyskać dostęp do wewnętrznej klasy.

+0

Fun problemem :) String i łańcuch są takie ta sama rzecz. Myślę, że jest bardziej prawdopodobne, że różne wersje .Net i ta serializacja wygląda teraz nieco inaczej – Leon

+0

Zauważyłem, że plik1.bin jest klasą publiczną, gdzie plik2 nie jest. Czy to może być problem? – briarfox

+0

, więc czy teraz problem polega na tym, że w ogóle nie możesz serializować klasy? – Leon

Odpowiedz

1

Domyślnie wewnętrzne elementy są niewidoczne dla zewnętrznych złożeń, w tym IronPython, ale można to zmienić.

Jeśli używasz ipy.exe, uruchom go poprzez:

ipy.exe -X:PrivateBinding 

Jeśli jesteś gospodarzem silnik IronPython skryptowy, a następnie dodać opcję:

IDictionary<string, object> options = new Dictionary<string, object>(); 

options.Add("PrivateBinding", true); 

ScriptEngine engine = IronPython.Hosting.Python.CreateEngine(options);