udv,
elmondom roviden a gondomat.
van egy A osztalyom, amiben van egy olyan, hogy
List<B>
, B -ben pedig egy
List<A>
-m (N:N kapcsolat van kozottuk)
ha ezt szeretnem WSbol visszaadni, a JAXB nem tudja jol serializalni, mert korkoros referencia miatt vegtelen ciklusba fut. (nem, egyelore nem akarok XStreamet
hasznalni)
most azt csinalom, hogy letrehoztam egy ATransferObject -et, ami a
List<B>
helyett egy
List<Integer>
-t tartalmazm, amiben a B objektumok idi talalhatoak.
(ezek biztos nem nullok)
namost soksok osztalynal ez nagyon korulmenyes munka, raadasul a regieket is mindig karban kell tartanom ha ott valtozik vmi.
kitaltaltam, hogy mi lenne, ha sajat annotaciokat bevezetnek, es irnek egy osztaly-gyarto eljarast, ami az annotaciok alapjan reflection segitsegevel
letrehoz egy uj osztalyt.
hogy csinaljam? :) az annotacios resz kesz, reflectiont tudom hasznalni, csak nem tudom hogy tudnek uj osztalyt letrehozni.
es legyszi, ne azt mondjatok, hogy egy stringbe rakjam ossze, es azt etessem meg a class loaderrel.. :)
- 2118 megtekintés
Hozzászólások
ide kiraktam egy kis peldat, hatha abbol jobban ertheto
az EntityTransferObject -et szeretnem a sajat annotaciok segitsegevel dinamikusan letrehozni.
- A hozzászóláshoz be kell jelentkezni
Én úgy tudom, hogy a class létrehozás reflectiönnel még a 6-os Javának sem része (.NET-ben azt hiszem van ilyen szolgáltatás).
Amit lehet csinálni, hogy Java kódot gyártasz, amit fordítóval lefordítasz és a keletkezett class-t betöltöd. Erre két megoldást tudok elképzelni:
- Régebben hallottam, hogy valamelyik verziótól kezdve erre lesz API. Ennek utánajárhatsz hátha a 6-osban már van.
- Használhatod az ecj Eclipse compilert, ami egyetlen önjáró jar-ként letölthető és elég jól dokumentált, hogy hogy kell használni.
Azonban én inkább azt javasolnám, hogy valahogy máshogy oldd meg a problémát, ne kódgenerálással :-)!
- A hozzászóláshoz be kell jelentkezni
J2EE kornyezetben a kulso fordito hivogatasa nem jarhato ut, es nemis tul elegans.
nem kodot akarok generalni, classt akarok epiteni. :) nagy kulonbseg.
primitiv megoldasi otletem van, de az nem olyan szep. [csinaljunk egy fix osztalyt, amiben map van,
es reflectionnel mar feltudjuk tolteni adatokkal egy ilyen class peldanyat]
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy rosszul értem a problémád, de nem arról van szó, hogy van egy N:N kapcsolat, amit serializalni akarsz, de az oda-vissza referencia miatt nem tudsz?
Ha ezek kölcsönös referenciák, akkor nem lehetne azt megcsinálni, hogy az egyik osztály esetén transient List-et használnál, és a deserializáció (de csúnya ez így leírva ;) ) után a másik alapján visszaállítod a referenciákat?
- A hozzászóláshoz be kell jelentkezni
++1
Nem fogsz tudni class-t létrehozni a VM-ben, legalábbis ilyesmi nem része a szabványnak. A reflection-el is csak vizsgálni/használni tudod a meglévő és lefordított osztályokat. Ld pl. hogy a reflection nem támogatja a genericeket, hiszen futásidőben type erasure van érvényben.
Ha körkörös referenciáid vannak, akkor az vagy design error, vagy pedig tranziens/redundáns referencia (azaz olyan, amelyik nem esszenciális, de pl. lehetőv teszi az O(1) elérését egy olyan objektumnak, amit máskülönben mindig meg kéne keresni valamilyen listából). Utóbbi esetben transient kulcsszó elé, és deszerializáláskor vissza kell állítani.
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
miert ne lehetne korkoros referencia? ugy utalom mikor nulla alappal dobaloznak az emberek olyan szavakkal, hogy "design error".
mondjuk vannak filmjeid, meg vannak kategoriaid. ha A film tartozik a horror kategoriaba, akkor Aban van egy ref a kategoria megfelelo entitatasara, es visszafele is. olvasgass egy kis ORM theoryt.
az eredeti postra: nem teszem tranziensse, mert az adatbazisban teljesen jo ha bennevan, es _nagyon_ workaround szagu a dolog. nem tehetek rola, hogy idiotak csinaltak a JAX-WS -t.
amugy a topic mar targytalan, van ra megoldas, a classloader leszarmazottjaban osszelehet hozni mindenfele ugyesseget asmel is, de en talaltam jobbat, ebbol fogok diplomamunkat irni. :)
[a transient nem tiszta megoldas, bidirekcios referenciak teljesen elfogadottak, ne dobalozzatok mar a design errorral. a masik meg, hogy akarhonnan nezve az objektummodellt sokkal tisztabb, ha ilyenek vannak. az asmel es az apache projekttel [bcel vagy ilyesmi a neve] az a baj, hogy nagyonnagyon korulmenyes komolyabb munkara.
van ra jobb megoldas, ha elkeszul a diplomamunka, kidobom pdfbe]
- A hozzászóláshoz be kell jelentkezni
"ugy utalom mikor nulla alappal dobaloznak"
Plz. olvasd már el hogy mit írtam...
design error _VAGY_ (!!!) redundáns referencia
Ha az előbbi lenne, akkor sem mondtam, hogy a te hibád, lehet h más csinálta és neked ezzel kell 1üttélni.
Ha az utóbbi akkor írtam megoldást rá. Én kérek elnézést, hogy segíteni próbáltam.
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
nincs azzal semmi baj, ha segiteni probaltal, sot, koszonom :)
csak sokan jottek mostanaban ilyen design error uzikkel, es eddig nem derult ki h en kurtam el, es neha mar elegem van belole :)
amugy csak akkor redundans, ha az egesz objektum-grafot nezed: barmelyik oldalrol szemlelve is csak egy sima referencia. :)
igy egyszerubb kezelni.
- A hozzászóláshoz be kell jelentkezni
ja igen, a futasideju erasurerol: az milyen gaz.. van valami logikus oka, hogy miert van ez igy? miert nem tartjuk meg ezeket az infokat?
- A hozzászóláshoz be kell jelentkezni
Egy nagyon egyszerű oka van: csak így tudták megoldani, hogy a genericessé tegyék az API-t (főleg a konténereket), ugyanakkor minden kód visszafelé kompatibilis maradjon a genericeket megelőző időből. Minden generic mögött ugyanúgy objectekkel/casttal operál, csakhogy már fordítási időben lehet a kód helyességét ellenőrizni.
Nehezen tudna mit kezdeni a type infókkal egy korábbi class loader.
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
Ha a jaxb ri-vel használod nézd meg ezt: https://jaxb.dev.java.net/guide/Mapping_cyclic_references_to_XML.html, az utolsó pont kell neked szerintem.
- A hozzászóláshoz be kell jelentkezni
ez jo, egy nagy gond van vele, hogy ugye megkell mondanom mire hivatkozok, ami a teljes objektumgraf szerializacioval jar, ami nem szerencses parmillio rekordnal. gondolj egy dvds webboltra, ha van a filmben hivatkozas a kategoriara, abban pedig parezer film, akkor leszerizaljuk azokat is..? :-)
- A hozzászóláshoz be kell jelentkezni
Ekkora mennyisegu adatot miert XML-ben tarolsz? Adatcsere szempontjabol sokkal hasznosabb lehet talan a protobuf kiprobalasa.
- A hozzászóláshoz be kell jelentkezni
ez a lenyeg. NEM AKAROM TAROLNI. sem atvinni sehova. csak szar a JAXB, es csak igy tudja feloldalni a korkoros refeket.
- A hozzászóláshoz be kell jelentkezni
Ha nem akarod tarolni, mihezz kell az XML Binding?
- A hozzászóláshoz be kell jelentkezni
ugy ertem a teljes objektumgrafot nem akarom.
ugyesen akarok szerializalni... :)
mar kitalaltam a megoldast, ha elkeszulok vele (diplomamunka lesz), kirakom vhova. eleg brutal otlett lett mondjuk :)
- A hozzászóláshoz be kell jelentkezni
kész van a diplomamunkád? érdekelne az ötlet.
- A hozzászóláshoz be kell jelentkezni