2015-05-08 11 views
5

У меня возникла проблема с получением данных из сериализованного класса C# с помощью python. У меня есть два файла, содержащие классы. Во-первых, я могу зацикливать массив и захватить общедоступные переменные. Однако во втором файле я вижу класс, но не могу получить доступ к любой из переменных. Прошло уже 10 лет, так как я использовал C# и бил головой о компьютер. Единственное различие, которое я вижу, это file1.bin использует String, где file2.bin использует строку. Любые указатели были бы полезны.python открыть сериализованный файл C#

ironpython используется для чтения .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 - (упрощенно) массив Resident - может получить доступ к данным

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 (упрощенный) Массив Resident информации Не удается получить доступ к данным

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

обновление

После того, как вы приблизились, кажется, что один клас s является общедоступным, а другой является внутренним. Однако я не уверен, как получить доступ к внутреннему классу.

+0

Fun проблема :) Строка и струне являются то же самое. Я думаю, что это скорее другие версии .Net, и эта сериализация выглядит немного иначе. – Leon

+0

Просто заметил, что file1.bin - это открытый класс, где file2.bin - нет. Это может быть проблема? – briarfox

+0

так теперь проблема в том, что вы не можете сериализовать класс вообще? – Leon

ответ

1

По умолчанию внутренние элементы невидимы для внешних сборок, включая IronPython, но вы можете это изменить.

Если вы работаете ipy.exe, запустить его:

ipy.exe -X:PrivateBinding 

Если хостинг IronPython скриптов, затем добавить опцию:

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

options.Add("PrivateBinding", true); 

ScriptEngine engine = IronPython.Hosting.Python.CreateEngine(options); 
Смежные вопросы