1

生データを保存するだけで、クラス定義を削除して、Javaシリアル化ファイルをPython pklファイルに変換しようとしています

import java.io
import cPickle as pickle
from pprint import pprint
import os
import com.cds.magellon.reports.beans.common

def toPython(val):
  if hasattr(val,'getClass'):
    className = val.getClass().getName()
    if className == 'java.util.Hashtable':
       return toDict(val)
    if className == 'java.util.Vector':
      vals = []
      for x in val:
        vals.append(toPython(x))
    else:
      print val.getClass().getName()
      return None
  else:
    return val

def toDict(jobj):
  obj = {}
  for k in jobj.keys():
    val = jobj[k]
    obj[k] = toPython(val)
  return obj

def convert(dir):
  for filename in os.listdir(dir):
    if filename.endswith('.pkl'):
      continue
    fd = file(os.path.join(dir,filename),'rb')
    try:
      obj = java.io.ObjectInputStream(fd).readObject()
      pobj = toPython(obj)
      pickle.dump(pobj,file(os.path.join(dir,filename + ".pkl"),'wb'))
      print "Saved", filename
    except Exception, e:
      print "Failed", filename, e

a = com.cds.magellon.reports.beans.common.AdvancedFilterUserBean()
a.setFilterName('FRED')
print a.getClass(),a.getFilterName()
convert('perfmonitors')

[Andy@bagend www]$ jython test.py
com.cds.magellon.reports.beans.common.AdvancedFilterUserBean FRED

Traceback (innermost last):
  File "test.py", line 54, in ?
  File "test.py", line 38, in convert
   at java.lang.Class.forName(libgcj.so.7rh)
   at java.io.ObjectInputStream.resolveClass(libgcj.so.7rh)
   at java.io.ObjectInputStream.readClassDescriptor(libgcj.so.7rh)
   at java.io.ObjectInputStream.readObject(libgcj.so.7rh)
   at java.io.ObjectInputStream.readObject(libgcj.so.7rh)
   at java.io.ObjectInputStream.readArrayElements(libgcj.so.7rh)
   at java.io.ObjectInputStream.readObject(libgcj.so.7rh)
   at java.io.ObjectInputStream.readFields(libgcj.so.7rh)
   at java.io.ObjectInputStream.readObject(libgcj.so.7rh)
   at java.util.Hashtable.readObject(libgcj.so.7rh)
   at java.lang.reflect.Method.invoke(libgcj.so.7rh)
   at java.io.ObjectInputStream.callReadMethod(libgcj.so.7rh)
   at java.io.ObjectInputStream.readObject(libgcj.so.7rh)
   at java.util.Hashtable.readObject(libgcj.so.7rh)
   at java.lang.reflect.Method.invoke(libgcj.so.7rh)
   at java.io.ObjectInputStream.callReadMethod(libgcj.so.7rh)
   at java.io.ObjectInputStream.readObject(libgcj.so.7rh)
   at java.lang.reflect.Method.invoke(libgcj.so.7rh)

java.lang.ClassNotFoundException: java.lang.ClassNotFoundException:       
com.cds.magellon.reports.beans.common.AdvancedFilterUserBean

AdvancedFilterUserBean インスタンスを作成できますが、java.io.ObjectInputStream(fd).readObject() でオブジェクトを作成できません

インポートした Java クラスを readObject() に認識させる方法について何かアイデアを持っている人はいますか

ありがとう

アンディ

4

0 に答える 0