09. april 2003 - 10:09Der er
9 kommentarer og 1 løsning
En SerializationException hvorfor?
Jeg har et problem med at serialize exception objecter.
I det konkrete tilfælde drejer det sig om en HttpException, som smider en SerializationException, når jeg prøver at serialize den (!).
Et stykke kode: 1) Exception exception = new HttpException("tester");
2) IFormatter formatter = new BinaryFormatter(); 3) System.IO.MemoryStream myStream = new System.IO.MemoryStream(); 4) formatter.Serialize( myStream, exception );
I linie 4 kommer der en SerializationException med message: "The type System.Web.HttpException in Assembly System.Web, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a is not marked as serializable."
Hvis man kigger i dokumentationen, så er HttpException serializable, og hvis man kigger nærmere på den med reflection kan man se at faktisk implementere ISerializable (prøv f.eks. med WinCV tool'et). Udtrykket (exception is ISerializable) evaluerer til sandt...
Hvis jeg i ovenstående kode ændrer exception typen til "Exception" (linie 1) virker det. Det hjælper ikke at typecaste til hverken Exception eller ISerializable i linie 4 (selvom begge casts lykkedes).
Kigger man nærmere på den exception i debuggeren, så er alle referencer til eksterne objecter null (f.eks. InnerException, TargetSite, ExceptionMethod etc.) så det er næppe fordi jeg er afhængig af objekter der ikke er serializable...
Ovenstående er kompileret i et console project, men resultatet er det samme i et ASP.NET project (hvis du altså fanger den exception).
Nu synes jeg snart jeg har undersøgt alt hvad jeg kan komme i tanke om, HJÆLP!
Ydermere, hvis du kigger i dokumentationen vil du se at HttpException blot arver Exception klassens implementering af ISerializable.GetObjectData og altså ikke selv supplerer en implementation af GetObjectData.
cyberfessor>> Det nytte jo kun hvis alle de HttpExceptions han ønsker at serialisere er kastet af ham selv, ellers skal han overtale de "andre" klasser til at instantiere SubHttpExceptions i stedet for HttpException ;-)
Men det bliver HttpException jo ikke serializable af, dvs. det bliver nødvendigt at:
try { } catch (HttpException e) { //Vi kan ikke bruge innerException funktionalitet da vi jo ikke //kan serialisere HttpException SubHttpException subE = new SubHttpException(e.propertyEt, e.propertyTo); }
Det kan måske godt lade sig gøre, men det bryder med den "standard" der er for exceptions, nemlig at ved genkast skal den nye exception referere den oprindelige exception gennem innerException. Alt i alt må den rigtige løsning være custom serialization.
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.