2015-05-08 11 views
5

Sto riscontrando un problema nel recuperare i dati da una classe serializzata C# con python. Ho due file contenenti le classi. Il primo sono in grado di eseguire il loop della matrice e di prendere le variabili pubbliche. Comunque nel secondo file vedo la classe ma non riesco ad accedere a nessuna delle variabili. Sono passati più di 10 anni da quando ho usato C# e ho battuto la testa contro il computer. L'unica differenza che posso vedere è file1.bin utilizza String dove file2.bin utilizza una stringa. Qualsiasi suggerimento sarebbe utile.python apre un file C# serializzato

ironpython utilizzato per leggere i file .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 - (semplificato) serie di Resident - possono accedere ai dati

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 (semplificato) Array di Info residente non possono accedere ai dati

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

aggiornamento

Dopo aver visto più vicino sembra che un clas s è pubblico e l'altro è interno. Tuttavia, non sono sicuro di come accedere alla classe interna.

+0

Fun problema :) String e la stringa sono la stessa cosa. Penso che sia più probabile che versioni diverse di .Net e quella serializzazione siano leggermente diverse ora – Leon

+0

Ho appena notato che file1.bin è una classe pubblica in cui file2.bin non lo è. Potrebbe essere questo il problema? – briarfox

+0

quindi il problema è ora più lungo sul quale non è possibile serializzare la classe? – Leon

risposta

1

Per impostazione predefinita, i membri interni sono invisibili agli assembly esterni, incluso IronPython, ma è possibile modificarlo.

Se si esegue ipy.exe, avviarlo:

ipy.exe -X:PrivateBinding 

Se si ospita il motore di scripting IronPython, quindi aggiungere un'opzione:

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

options.Add("PrivateBinding", true); 

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