Laden...

XmlSerialization verhindern

Letzter Beitrag vor 11 Jahren 7 Posts 1.650 Views
XmlSerialization verhindern

Hallo!

Kennt jemand eine Möglichkeit in einer Klasse die ISerializable implementiert zu erreichen, dass eine Exception (NotSupportedException) geworfen wird, sobald das Objekt an einen XmlSerializer übergeben wird?
Dummerweise ist ein Objekt, das ISerializable implementiert (und nicht IXmlSerializable) im Grunde auch mit einem XmlSerializer serialisierbar, solange es keine öffentlichen Eigenschaften ohne Setter aufweist.

Mein anfängliches (grausames) Workaround war, zusätzlich IXmlSerializable zu implementieren und beim Aufruf von ReadXml und WriteXml eine Exception zu werfen. Das ist aber natürlich nicht im Sinne des Erfinders..
Ich muss also von vornherein klarstellen, dass dieses Objekt nicht mit dem XmlSerializer serialisierbar ist.

Gibt es da eine Möglichkeit? Ich konnte leider trotz langer Suche keine Informationen dazu finden.

Vielen Dank im Voraus!

Hmm,

warum sollte man das tun? Und selbst wenn Du das verhindern könntest, gibt es andere Möglichkeiten das Object zu serialisieren.

Hallo theYoRecords,

ich denke nicht, dass man das verhindern kann. Genauso wie man nicht verhindert kann, dass irgendjemand die Properties des Objekts per Reflection ausliest. Und nichts anderes macht der XmlSerializer. Der kümmert sich insbesondere nicht um ISerializable und auch nicht um SerializableAttribute. Und selbst wenn er das tun würde, dann sicher nicht in dem Sinne, dass wenn binäre Serialisierung möglich ist, die XmlSerialisierung verhindert wird.

Mit XmlIgnoreAttribute kann man verhindern, dass eine Property xml-serialisiert wird. Du könntest alle Properties deiner Klasse so kennzeichnen, wenn dir das nützlich erscheint. Du könntest außerdem im System.Xml.Serialization-Namespace nach weiteren Attributen suchen, mit denen man die Xml-Serialisierung steuern kann. Möglicherweise gibt es in der Klasse XmlAttributes noch weitere Möglichkeiten. Aber damit kenne ich mich nicht aus.

herbivore

Danke für eure Antworten!
Das hatte ich schon befürchtet. Das XmlIgnoreAttribute hilft in diesem Fall leider auch nicht weiter, da der Entwickler dann ja auch erst beim bzw. sogar erst nach dem Serialisieren merken würde, dass das nicht funktioniert. Und sonst gibt es auch nichts hilfreiches.
Insofern ist mein Workaround wohl die beste Möglichkeit, obwohl es mir nicht gefällt, ein Interface zu implementieren, das schlussendlich überhaupt nicht genutzt wird / werden kann.

Es wäre schön wenn man irgendwie abfragen könnte, wie das Objekt gerade serialisiert wird oder es überhaupt einfach ein NotXmlSerializable-Attribut geben würde. Oder noch viel besser: Wenn man IXmlSerializable implementieren müsste um ein Objekt mit der XmlSerializer serialisieren zu können.

Klar gibt es andere Möglichkeiten das Objekt zu serialisieren. So soll es ja auch sein. Nur soll / kann es nicht mit XML dargestellt werden.

Und warum musst Du Dich hier darum kümmern? Wo ist der sinn?
Im Prinzip muss sich der Entwickler darum kümmern und informieren, ob eine Serialisierung möglich ist oder nicht. Und Du musst das halt in der Doku oder Co hinterlegen.

Nicht anders funktionierts ja auch im .NET Framework selbst: hier gibts genug Klassen die serialisierbar sind aber es überhaupt keinen sinn macht.

So nicht ganz richtig

Hi,

meines Erachtens kann man das mit Hilfe der Code-Permissions verbieten.
Ich denke, dass hier bspw. das ReflectionPermission- oder aber das StrongNameIdentityPermission-Attribut helfen könnten.

Grüße,
slig

Danke für eure Antworten (und Sorry für die späte Rückmeldung)!

Im Prinzip hat Abt recht. Eigentlich sollte das nicht meine Sorge sein. Dennoch glaube ich nicht, dass es gegen einige konventionen verstößt, ein Interface zu implementieren, dass man nicht verwenden können soll.

Das mit den Codepermissions werd ich mal unter die Lupe nehmen, danke.