20. juni 2005 - 18:11Der er
22 kommentarer og 1 løsning
Serialisering af objekter som ikke er markeret med [Serializable]
Tjah, opgaven kan egetlig defineres ganske enkelt, ligesom angivet i spørgsmålets titel.
Jeg skal bruge en metode, wrapper-klasse eller noget andet som kan tage et serialisere et objekt som ikke er markeret med [Serializable]
Helt specifikt skal jeg bruge det til at serialisere f.eks. et Microsoft.Office.Interop.Outlook.AppointmentItem. Hvis jeg prøver at serialisere et objekt indeholdene et sådanne objekt, eller hvilket som helst andet objekt som ikke er markeret med [Serializable], kaster den om sig med undtagelser - f.eks.: "ReadCallback Exception: System.Runtime.Serialization.SerializationException: Type 'System.__ComObject' in Assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable."
Er der nogen som kan klare denne opgave - i så fald vil det være MEGET værdsat.
du kan vel heller ikke serialisere noget i Java som ikke implementerer java.io.Serializable, men der er nogle alternativer for klasser som opfylder java beans konventionen, er det dem som du tænker på ?
ja - jeg tror godt at du kan lave samme nummer i .NET
transient => [NonSerialized]
writeObject & readObject metoder => ISerializable interface og en GetObjectData metode og en speciel constructor
men husk at det kun læser problemet hvis både ind og ud bruger den samme adapter - eller sagt på en anden måde - det virker kun hvis end koden både ind og ud er under din kontrol
public class Test { private static byte[] serialize(Object o) throws IOException { ByteArrayOutputStream ba = new ByteArrayOutputStream(1000); ObjectOutputStream oba = new ObjectOutputStream(ba); oba.writeObject(o); return ba.toByteArray(); }
private static Object deserialize(byte[] b) throws IOException, ClassNotFoundException { ByteArrayInputStream ba = new ByteArrayInputStream(b); ObjectInputStream oba = new ObjectInputStream(ba); return oba.readObject(); }
public static void main(String[] args) throws IOException, ClassNotFoundException { Data o = new Data(); o.setIv(123); o.setSv("abc"); System.out.println(o); byte[] b = serialize(new DataSerializable(o)); Data o2 = (Data) ((SerializableAdapter)deserialize(b)).getObject(); System.out.println(o2); } }
class DataSerializable extends SerializableAdapter { public DataSerializable(Data o) { object = o; }
Jeg må sige at det er et flot stykke arbejde, men desværre virker det umiddelbart ikke for mig eftersom at den klasse jeg ønsker at serialisere ikke er en klasse jeg selv har konstrueret, og selv ved at prøve at ændre DataSerializable til at være lidt mere generel får jeg stadig min exception fra tidligere. Problemet ligger nok i at den prøver at serialisere den kæde af objekter som der er i klassen.
[Serializable] class DataSerializable : SerializableAdapter { public DataSerializable(Data o) { obj = o; } private DataSerializable(SerializationInfo info, StreamingContext context) { obj = new Data(); ((Data)obj).Iv = info.GetValue("iv",typeof(Data)); } public override void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("iv",((Data)obj).Iv,typeof(Data)); } }
Umiddelbart tror jeg ikke at det kan lade sig gøre overhovedet.
der er ikke noget i min kode som gør at man behøver selv behøver at have lavet Data eller at den kan noget specielt (bortset fra at man kan sætte dens værdier)
men hvis Data selv indeholder nogle objekter som ikke er kan det godt blive tricky
men det burde vel kunne lade sig gøre at pille alle de atomiske dele ud når der skal serialiseres og samle dem igen når der skal deserialiseres
metoderne bliver noget større end de iv & sv eksempler men bør det ikke kunne lade sig gøre ?
Jo, umiddelbart ville det nok kunne lade sig gøre - men pointen var at jeg gerne ville være fri for at skulle skrive så meget. En generel wrapper er nu engang pænere.
Jeg tror dog at det ender med at jeg blot skriver en data container som er seriliserbar - noget besværligt med alle de attributter der er i de oprindelige objekter. Så hellere bruge en dag eller to på at skrive en generel serializer ;)
Så, havde lige en eksamen der skulle overstås. Men jeg takker mange gange for hjælpen. Det lykkedes mig ikke at bruge din hjælp til det det oprindeligt var tiltænkt, men til et andet projekt. Den første problemstilling fik jeg løst på andne vis.
det er en lille finesse på Eksperten som ofte driller folk, fordi den er lidt ulogisk
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.