XML-Serializierung mittels pyxser

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Decker
User
Beiträge: 1
Registriert: Donnerstag 13. Februar 2014, 16:46

Hallo,

ich bin Anfänger, was die Entwicklung in Python angeht. Für ein Programm an meinem Raspberry Pi habe ich angefangen in Python zu entwickeln und würde jetzt gerne mit der Klasse http://sourceforge.net/projects/pyxser/ ein Log-File schreiben. Die Serialisierung ist kein Problem. Nur beim Deserialisieren steh ich vor einem für mich unlösbaren Problem. Ich kann mir nicht erklären, warum das nicht geht. Vielleicht hat hier ja jemand schon Erfahrung mit pyxser und kann mir helfen.

Ich habe eine kleine Test-Programm geschrieben, das so aussieht:

Code: Alles auswählen

from base_lib import cLog

print('PI is starting.')

oLog = cLog.cLog()
oLog.ReadXMLLog("temp.xml")
oLog.AddXMLLog(10, "test", "SDGFHDSGF")
oLog.WriteXMLLog("temp.xml")
Die zu serialisierende Klasse ist die cLog hier:

Code: Alles auswählen

import pyxser
from time import gmtime, strftime

class cLog(object):
    '''
    Klasse zum Handling der Log-Files
    '''
    lstLogMessages = []
    sPath = None

    def __init__(self):
        '''
        Constructor
        '''
        
    def AddXMLLog(self, tStatus, tPgm, tText):
        '''
        Schreibt eine Log-Datei
        '''
        self.lstLogMessages.append(cLogMessage(tStatus, tPgm, tText))
        self.lstLogMessages = self.lstLogMessages
        
    def WriteXMLLog(self, tPath):
        '''
        Schreibt eine Log-Datei
        '''
        self.sPath = tPath;
        oLogFile = open(self.sPath, "w")
        oSer = pyxser.serialize(obj = self, enc="utf-8")
        oLogFile.write(oSer)
        oLogFile.close()
        
    def ReadXMLLog(self, tPath):
        '''
        Liest eine Log-Datei
        '''
        self.sPath = tPath
        oLogFile = open(self.sPath ,"r")
        oStream = oLogFile.read()
        oUnSer = pyxser.unserialize(obj = oStream, enc="utf-8")
        self = oUnSer
        oLogFile.close()


Und die cLog soll eine Liste von der Klasse cLogMessage bekommen:

Code: Alles auswählen

class cLogMessage(object):
    oDate = None
    nStatus = None
    sText = None
    sPgm = None
    
    def __init__(self, tStatus = None ,tPgm = None ,tText = None):
        '''
        Constructor
        '''
        if (tStatus != None) and (tPgm != None) and (tText != None):
            self.oDate = strftime("%H:%M:%S",gmtime())
            self.sPgm = tPgm
            self.nStatus = tStatus
            self.sText = tText
Ich denke mir, dass es irgend eine Kleinigkeit sein muss, denn es kann ja kaum sein, dass die Serialisierung ohne Probleme klappt nur anders herum nicht.

Fehler bekomme ich folgenden

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/christian/shared/rpicam/Programmcode/rpicam/rpicam/start.py", line 16, in <module>
    oLog.AddXMLLog(10, "test", "SDGFHDSGF")
  File "/home/christian/shared/rpicam/Programmcode/rpicam/rpicam/base_lib/cLog.py", line 26, in AddXMLLog
    self.lstLogMessages.append(cLogMessage(tStatus, tPgm, tText))
  File "/home/christian/shared/rpicam/Programmcode/rpicam/rpicam/base_lib/cLog.py", line 61, in __init__
    self.oDate = strftime("%H:%M:%S",gmtime())
SystemError: ../Objects/classobject.c:511: bad argument to internal function
Vielen Dank schon mal für die Hilfe.

Viele Grüße
Chris
BlackJack

@Decker: Bei einem `SystemError` stimmt etwas mit dem Python-Interpreter nicht. Da kann der gezeigte Quelltext nicht dran schuld sein. Ich vermute mal Du verwendest irgendeine C-Erweiterung die nicht sauber programmiert ist und den Interpreter in einen inkonsistenten Zustand bringt und das nur zufällig bei der Zeile auf die Nase fällt wo das letztendlich passiert.

Oder dem Interpreter ist schlecht geworden als er Deinen Quelltext gesehen hat. Werd doch bitte diese unsinnigen einbuchstabigen Präfixe los und halte Dich an die üblichen Namenskollisionen. Und hör auf Klassenattribute als Default-Werte zu missbrauchen und bei `cLog` sogar zum Speichern von Daten.

Warum überhaupt die Serialisierung einer so simplen Klasse als XML? So etwas wie ``self = oUnSer`` macht keinen Sinn. `self` ist ein ganz normaler lokaler Name. Da passiert mit Sicherheit nicht das was Du gerne hättest. Das was Du gerne hättest geht nicht. Da solltest Du eine Klassenmethode zum erstellen eines Exemplars aus einer Datei verwenden.

Edit: Entgegen Deiner Aussage tritt die Ausnahme auch gar nicht beim deserialisieren auf sondern hat gar nichts mit serialisieren oder deserialisieren zu tun.
Antworten