Czy istnieje jakaś biblioteka do deserializacji z pythonem, który jest serializowany za pomocą java?Czy istnieje jakaś biblioteka do deserializacji z pythonem, która jest serializowana z java
Odpowiedz
Serigrafia Java jest reprezentacją struktur klasy/danych i ściśle powiązana z maszyną wirtualną. W związku z tym będzie to trudne do przetłumaczenia na świat Pythona.
Java serializacji binarnej jest naprawdę zaprojektowane do użycia z Java. Aby to zrobić w Pythonie, musisz mieć wszystkie odpowiednie klasy Java dostępne do inspekcji i odpowiednio utworzyć obiekty Python - byłoby to dość odrażające i krucho.
Lepiej używać formatu serializacji między platformami, takiego jak Thrift, Protocol Buffers, JSON lub XML. Jeśli nie możesz zmienić używanego formatu serializacji w kodzie Java, proponuję napisać nowy kod Java, który deserializuje się z formatu binarnego, a następnie ponownie zostanie przeniesiony do formatu wieloplatformowego.
Gdybym był tobą, przeczytałbym dane z Jython i albo ponownie je zsynchronizowałam z pickle
(żebyś mógł czytać go z Pythona), albo w neutralnym językowo formacie, takim jak XML.
Jeśli używasz klas Java, to nawet nie wiem, co to znaczy deserializować klasy Java w środowisku Python. Jeśli używasz tylko prostych elementów pierwotnych (int, float, string), prawdopodobnie nie byłoby zbyt trudno zbudować bibliotekę Pythona, która może deserializować format Java.
Jednak, jak powiedzieli inni, istnieją lepsze rozwiązania wieloplatformowe.
Nie mówisz, czy masz kontrolę nad serializacją danych, czy nie, ale jeśli tak, to JSON wydaje się być ładnym formatem, który jest wieloplatformowy i ma dobrą równowagę między czytelnym dla człowieka i czytelnym dla komputera. For java i distributed with python.
+1 Kto to zrobił? Pytanie jest niejednoznaczne i jest to z pewnością poprawna odpowiedź.OP nie zawiera żadnego opisu tego, co jest serializowane. Przypuszczam, że można założyć, że OP odnosi się do java.io.Serializable, ale on/ona może równie dobrze odnosić się do jakiegoś zastrzeżonego protokołu przewodowego. –
Inną opcją jest użycie Perspective Broker z Twisted. Ich jest Java implementation. Jeśli potrzebujesz tylko serializacji/deserialization możesz użyć tylko Banana (protokół) lub Jelly (utrwalanie) bezpośrednio. Galaretka jest oparta na ekspresji w oparciu o ekspresję S obiektów.
Oto bardzo, bardzo, surowa implementacja, która nie wymaga żadnego importu. Trudne jest to, że niektóre klasy mają niestandardowe serializery, które wymagają oryginalnego kodu do deserializacji. Ponadto, mój konkretny plik był gzip'd, chociaż nie dodałem do niego kodu. Kiedyś te dwie strony dla odniesienia:
http://www.javaworld.com/community/node/2915 http://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html
#!/usr/bin/python
def parse(f):
h = lambda s: ' '.join('%.2X' % ord(x) for x in s) # format as hex
p = lambda s: sum(ord(x)*256**i for i, x in enumerate(reversed(s))) # parse integer
magic = f.read(2)
assert magic == '\xAC\xED', h(magic) # STREAM_MAGIC
assert p(f.read(2)) == 5 # STREAM_VERSION
handles = []
def parse_obj():
b = f.read(1)
if not b:
raise StopIteration # not necessarily the best thing to throw here.
if b == '\x70': # p TC_NULL
return None
elif b == '\x71': # q TC_REFERENCE
handle = p(f.read(4)) - 0x7E0000 # baseWireHandle
o = handles[handle]
return o[1]
elif b == '\x74': # t TC_STRING
string = f.read(p(f.read(2))).decode('utf-8')
handles.append(('TC_STRING', string))
return string
elif b == '\x75': # u TC_ARRAY
data = []
cls = parse_obj()
size = p(f.read(4))
handles.append(('TC_ARRAY', data))
assert cls['_name'] in ('[B', '[I'), (cls['_name'], size, f.read(50))
for x in range(size):
data.append(f.read({'[B': 1, '[I': 4}[cls['_name']]))
return data
elif b == '\x7E': # ~ TC_ENUM
enum = {}
enum['_cls'] = parse_obj()
handles.append(('TC_ENUM', enum))
enum['_name'] = parse_obj()
return enum
elif b == '\x72': # r TC_CLASSDESC
cls = {'fields': []}
full_name = f.read(p(f.read(2)))
cls['_name'] = full_name.split('.')[-1] # i don't care about full path
f.read(8) # uid
cls['flags'] = f.read(1)
handles.append(('TC_CLASSDESC', cls))
assert cls['flags'] in ('\2', '\3', '\x0C', '\x12'), h(cls['flags'])
b = f.read(2)
for i in range(p(b)):
typ = f.read(1)
name = f.read(p(f.read(2)))
fcls = parse_obj() if typ in 'L[' else ''
cls['fields'].append((name, typ, fcls.split('/')[-1])) # don't care about full path
b = f.read(1)
assert b == '\x78', h(b)
cls['parent'] = parse_obj()
return cls
# TC_OBJECT
assert b == '\x73', (h(b), h(f.read(4)), f.read(50))
obj = {}
obj['_cls'] = parse_obj()
obj['_name'] = obj['_cls']['_name']
handle = len(handles)
parents = [obj['_cls']]
while parents[0]['parent']:
parents.insert(0, parents[0]['parent'])
handles.append(('TC_OBJECT', obj))
for cls in parents:
for name, typ, fcls in cls['fields'] if cls['flags'] in ('\2', '\3') else []:
if typ == 'I': # Integer
obj[name] = p(f.read(4))
elif typ == 'S': # Short
obj[name] = p(f.read(2))
elif typ == 'J': # Long
obj[name] = p(f.read(8))
elif typ == 'Z': # Bool
b = f.read(1)
assert p(b) in (0, 1)
obj[name] = bool(p(b))
elif typ == 'F': # Float
obj[name] = h(f.read(4))
elif typ in 'BC': # Byte, Char
obj[name] = f.read(1)
elif typ in 'L[': # Object, Array
obj[name] = parse_obj()
else: # Unknown
assert False, (name, typ, fcls)
if cls['flags'] in ('\3', '\x0C'): # SC_WRITE_METHOD, SC_BLOCKDATA
b = f.read(1)
if b == '\x77': # see the readObject/writeObject methods
block = f.read(p(f.read(1)))
if cls['_name'].endswith('HashMap') or cls['_name'].endswith('Hashtable'):
# http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/util/HashMap.java.html
# http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/util/Hashtable.java.html
assert len(block) == 8, h(block)
size = p(block[4:])
obj['data'] = [] # python doesn't allow dicts as keys
for i in range(size):
k = parse_obj()
v = parse_obj()
obj['data'].append((k, v))
try:
obj['data'] = dict(obj['data'])
except TypeError:
pass # non hashable keys
elif cls['_name'].endswith('HashSet'):
# http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/util/HashSet.java.html
assert len(block) == 12, h(block)
size = p(block[-4:])
obj['data'] = []
for i in range(size):
obj['data'].append(parse_obj())
elif cls['_name'].endswith('ArrayList'):
# http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/util/ArrayList.java.html
assert len(block) == 4, h(block)
obj['data'] = []
for i in range(obj['size']):
obj['data'].append(parse_obj())
else:
assert False, cls['_name']
b = f.read(1)
assert b == '\x78', h(b) + ' ' + repr(f.read(50)) # TC_ENDBLOCKDATA
handles[handle] = ('py', obj)
return obj
objs = []
while 1:
try:
objs.append(parse_obj())
except StopIteration:
return objs
if __name__ == '__main__':
import sys, json
json.dump(parse(sys.stdin), sys.stdout, indent=2)
Dzięki! Działa z małą poprawką ('objs.append (parse_obj (''))' => 'objs.append (parse_obj())'). Zmieniłem twoją odpowiedź, aby to poprawić, a także, aby domyślnie działał jako filtr stdin => stdout. – akavel
Awesome. Dziękuję bardzo za poprawkę. Połączyłem też twój pomysł stdin-> stdout json. –
Tyle pro. Łał. Zadziwiać. – alvonellos
- 1. Czy istnieje jakaś biblioteka ActiveResource dla Java?
- 2. Czy istnieje jakaś biblioteka, która sprawia, że element create z ciągu jest łatwy?
- 3. Czy istnieje jakaś różnica między cpython i pythonem
- 4. Czy istnieje biblioteka Java, która może "zmienić" dwa obiekty?
- 5. Czy istnieje jakaś biblioteka do tworzenia formularzy i pól PDF?
- 6. Czy istnieje biblioteka IMAP Haskell, która współpracuje z TLS?
- 7. Biblioteka XQuery pod Pythonem
- 8. Czy istnieje biblioteka Java funkcji Unix?
- 9. Jak zaimplementować strukturę danych wykresu w java? Czy istnieje jakaś dostępna biblioteka?
- 10. Czy istnieje dobre IDE do budowania aplikacji GUI z Pythonem
- 11. Czy istnieje jakaś korzyść (semantyczna lub inna) do korzystania z metody statycznej, która wywołuje konstruktor?
- 12. Czy istnieje adnotacja? Jak działa biblioteka? (Java)
- 13. Czy istnieje jakaś funkcja haskell do łączenia listy z separatorem?
- 14. Czy istnieje biblioteka do rozpakowania plików .Z przy użyciu VB.NET?
- 15. Czy jest jakaś biblioteka realizująca efekt kolorów, taki jak lomografia?
- 16. Czy istnieje biblioteka Java do analizowania łańcuchów formatu printf?
- 17. Czy jest jakaś łatwa w użyciu biblioteka JavaScript XML polecająca?
- 18. Serializacja obiektu z podstawą i przekazywanie go do listy WebApi, która nie jest serializowana
- 19. Czy istnieje jakaś biblioteka do konwersji wikitext do formatu html przy użyciu php?
- 20. Czy istnieje dystrybucja Linuksa dostarczana z pythonem 3?
- 21. Generowanie instrukcji SQL z pythonem
- 22. Czy istnieje biblioteka JS, która obsługuje pisanie zapytań linq do sql z nodejs?
- 23. Czy istnieje kolejka (PriorityQueue), która jest również zestawem?
- 24. Crunching xml z pythonem
- 25. Czy istnieje biblioteka do automatycznego wypróbowywania CSS?
- 26. Czy istnieje jakaś metoda w appDelegate, która jest wywoływana, gdy aplikacja ulega awarii?
- 27. Czy istnieje biblioteka matematyki open-source związana z pokerem?
- 28. Czy istnieje biblioteka, która zapewnia płynny sposób tworzenia ciągów w formacie Java?
- 29. Biblioteka w java
- 30. budowniczy z Jackson do deserializacji
Czy twoje pytanie odnoszące się do protokołu java.io.Serializable lub innego mechanizmu serializacji? –
Nie mam kontroli nad serializacją. Serializacja odbywa się za pośrednictwem java.io.Serialization. Nie chcę używać jython – Prabu