Jörg,
Many thanks. The latter approach is good enough for now and is in fact expected
future requirement.
Best regards
Marcin Stefaniuk
Starszy programista
PKO Bank Polski
Departament Rozwoju Aplikacji Sprzedażowych i Wsparcia
Wydział Integracji Procesów i Usług
02-515 Warszawa, ul. Puławska 15
t: 22 580 30 39
Dbaj z nami o środowisko!
Nie drukuj tej wiadomości, ani innych dokumentów, jeśli nie jest to konieczne.
-Original Message-
From: Jörg Schaible [mailto:joerg.schai...@scalaris.com]
Sent: Thursday, October 25, 2012 9:07 AM
To: user@xstream.codehaus.org
Subject: [xstream-user] Re: Inheritance with interface and their
implementations but without class attribute
Hi Marcin,
Stefaniuk Marcin wrote:
I was searching for the answer through the list but haven't found
anything.
I have a class with an attribute of interface type.
@XStreamAlias(given)
public class Given {
@XStreamAsAttribute
public String name;
public Mock mock;
}
Interface is very simple:
@XStreamInclude({ExactMock.class})
public interface Mock {
void execute();
}
I have implementations of the interface:
@XStreamAlias(exact-mock)
public class ExactMock implements Mock {
@XStreamAsAttribute
String endpoint;
@XStreamAsAttribute
String name;
@Override
public void execute() {
// TODO Auto-generated method stub
}
}
It is easy to marshal as:
given that=My entry condition
mock type=exact-mock/
/given
Given the above class structure (type annotations are part of my
experiments) I would like to receive below XML structure: given that=My
entry condition
exact-mock endpoint=my-endpoint name=name-so-so /
/given
Important is to put aliases to element names but not any attribute. I have
attempt to make own converter but I would like to change main element
generation only. My implementations of interface would radically vary so
rest of marshall / unmarshall I would like to delegate to XStream again.
It should allow to write interface implementations without change of
converter. Is it possible?
First you have to understand that the tag name is produced by the converter
that handles the container i.e. in your case it is the converter (probably
the ReflectionConverter) that handles Given. The ReflectionConverter uses
the field names as tag names to assign the individual elements at
deserialization time again to the appropriate field.
What you can do now is to derive a custom converter from the
ReflectionConverter and declare the mock field to be omitted, handle it
yourself in the custom converter and call super afterwards (see my example
in the Hibernate thread some days ago).
Another approach is the usage of an implicit array here, but you would have
to change Given:
% ===
@XStreamAlias(given)
public class Given {
@XStreamAsAttribute
public String name;
@XStreamImplicit
public Mock[] mock;
}
% ===
In this case the ReflectionProvider will associate any element that is not a
field name, but represents a class (resp. an alias for a class) of type
Mock with the array in the field mock - matching your XML exactly.
- Jörg
-
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email