2010-01-05 9 views
12

Wie entferne ich die class = "Something" Attribute in Xstream.Xstream: Klassenattribut entfernen

I Xstream verwenden mit Anmerkungen

+0

Woher bekommen Sie class = "..." genau? Können Sie etwas generiertes XML posten? –

+1

http://markmail.org/message/t33x7hswlwsk766i – Cherian

Antwort

13

In der Tat ist das Problem nicht so klar formuliert wie es sollte. Ich vermute, dass Sie eine nicht standardmäßige Sammlung verwenden oder ein Feld eines Schnittstellentyps verwenden, für den XStream die tatsächliche Klasse speichern muss.

Im zweiten Fall können Sie einfach Alias:

xstream.alias("field name", Interface.class, ActualClassToUse.class);

Siehe http://markmail.org/message/gds63p3dnhpy3ef2 für weitere Details.

+0

Ich hatte ein ähnliches Problem und dies stellte sich als das Problem heraus. Ich war besorgt, dass ich Alias ​​javacode anstelle von Annotationen verwenden müsste, aber sie stellten sich als Komplemente heraus, da ich die tatsächliche Klasse zur Laufzeit bestimmen konnte. – Caoilte

+0

Gibt es dafür eine Federoxm-Alternative? – coffeMug

1

Können Sie ein Beispiel einer Ausgabe geben? Ich denke, das passiert normalerweise bei der Verwendung von Sammlungen. Ohne zu sehen, die Ausgabe, meine beste Vermutung ist, dass Sie Aliasnamen registrieren müssen:

xstream.alias("blog", Blog.class); 

Siehe http://x-stream.github.io/alias-tutorial.html für tiefergehende Abdeckung. Fügen Sie erneut eine Beispielausgabe ein.

2

Verwenden etwas dieser Art, die Klasse zu entfernen Attribut vollständig anstatt Aliasing es mit etwas anderem:

private String generateResponse(final XStream xStream) 
{ 
    StringWriter writer = new StringWriter(); 
    xStream.marshal(this, new PrettyPrintWriter(writer) { 
     @Override 
     public void addAttribute(final String key, final String value) 
     { 
      if (!key.equals("class")) 
      { 
       super.addAttribute(key, value); 
      } 
     } 
    }); 
    return writer.toString(); 
} 
18

ich seinen Code gelesen und fand, wenn Ihre Klasse nicht mapper.defaultImplementationOf(fieldType) ist, wird es die Standardklasse Attribut hinzufügen für Sie, außer der Klassenattributname ist null;

So eingestellt, wird das class =“Something“ entfernen Attribut

xstream.aliasSystemAttribute(null, "class"); 
+0

Gibt es eine Alternative zum Frühlings-Oxm? – coffeMug

1

Dieses Attribut angezeigt wird, zumindest, wenn es nicht offensichtlich ist, die Klasse verwendet werden soll. Die Verwendung der Schnittstelle ist ein Beispiel. In solchen Situationen, dass Sie versuchen können:

xStream.addDefaultImplementation(YourDefaultImplementation.class, YourInterface.class); 

.