2015-05-08 7 views
5

Ich habe ein Problem beim Abrufen von Daten aus einem C# Array serialisierten Klasse mit Python. Ich habe zwei Dateien mit den Klassen. Die erste Möglichkeit ist, das Array zu durchlaufen und die öffentlichen Variablen zu erfassen. In der zweiten Datei sehe ich die Klasse, kann aber nicht auf eine der Variablen zugreifen. Es ist 10+ Jahre her, dass ich C# benutzt habe und meinen Kopf gegen den Computer geschlagen habe. Der einzige Unterschied, den ich sehen kann, ist file1.bin verwendet String wo file2.bin String verwendet. Irgendwelche Hinweise wären mot hilfreich.Python öffnen Sie eine serialisierte C# -Datei

ironpython verwendet, um .bin-Dateien zu lesen.

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 - (vereinfacht) Array von Resident - Zugangsdaten können

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 (vereinfacht) Array von Resident Info Kein Zugriff auf Daten

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

update

Nach näherem Hinsehen scheint es, dass eine Klasse s ist öffentlich und das andere ist intern. Ich bin mir jedoch nicht sicher, wie ich auf die interne Klasse zugreifen soll.

+0

Fun Problem :) String und String sind die gleiche Sache. Ich würde denken, dass es wahrscheinlicher verschiedene Versionen von .Net ist und dass Serialisierung ein wenig anders aussieht jetzt – Leon

+0

Gerade bemerkt, dass file1.bin eine öffentliche Klasse ist, wo file2.bin nicht ist. Könnte das das Problem sein? – briarfox

+0

Also ist das Problem jetzt eher in den Reihen, dass Sie die Klasse überhaupt nicht serialisieren können? – Leon

Antwort

1

Standardmäßig sind interne Mitglieder für externe Assemblys einschließlich IronPython unsichtbar, aber Sie können das ändern.

Wenn Sie ipy.exe ausgeführt werden, starten Sie es nach:

ipy.exe -X:PrivateBinding 

Wenn Sie die IronPython Scripting-Engine hosten, dann eine Option hinzufügen:

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

options.Add("PrivateBinding", true); 

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