Laden...

XmlSerialization verhindern

Erstellt von theYoRecords vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.587 Views
T
theYoRecords Themenstarter:in
73 Beiträge seit 2012
vor 10 Jahren
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!

849 Beiträge seit 2006
vor 10 Jahren

Hmm,

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

49.485 Beiträge seit 2005
vor 10 Jahren

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

T
theYoRecords Themenstarter:in
73 Beiträge seit 2012
vor 10 Jahren

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.

16.842 Beiträge seit 2008
vor 10 Jahren

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.

7 Beiträge seit 2005
vor 10 Jahren
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

T
theYoRecords Themenstarter:in
73 Beiträge seit 2012
vor 10 Jahren

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.