我有一个对象“角色”,它可以包含几个“特权”,它们也是对象。现在,当我尝试使用 Xstream 序列化 Role 时,我的 xml 看起来像这样:
<role>
<roleName>Administrator</roleName>
<privileges class="org.hibernate.collection.PersistentSet">
<set>
<privilege>
<privilegeId>1001</privilegeId>
<privilegeName>Admin Privilege</privilegeName>
<privilegeKey>Admin</privilegeKey>
</privilege>
</set>
<initialized>true</initialized>
<owner class="role" reference="../.."/>
<cachedSize>-1</cachedSize>
<rolemodel.valueobject.Role.privileges</role>
<key class="int">3</key>
<dirty>false</dirty>
<storedSnapshot class="map">
<entry>
<privilege reference="../../../set/privilege"/>
<privilege reference="../../../set/privilege"/>
</entry>
</storedSnapshot>
</privileges>
</role>
我希望它看起来像这样:
<role>
<roleName>Administrator</roleName>
<privileges>
<privilegeId>1001</privilegeId>
<privilegeName>Admin Privilege</privilegeName>
<privilegeKey>Admin</privilegeKey>
</privileges>
</role>
我如何省略/删除/不包括所有这些附加字段?似乎它们是由休眠添加的“实用程序”字段,因为我没有在我的 hbm.xml 中声明它们。我已经尝试省略它们,将 Privileges 集合添加为隐式以及我在 XStream 页面上找到的其他内容。
编辑 我未能按照下面的建议创建 XSLT 模板,但发现自定义转换器是完成这项工作的非常好的简单工具。在此处查看帮助页面 - http://x-stream.github.io/converter-tutorial.html。这是我的元帅方法:
public void marshal(Object value, HierarchicalStreamWriter writer,
MarshallingContext context) {
Role role = (Role) value;
writer.startNode("roleId");
writer.setValue(role.getRoleId().toString());
writer.endNode();
writer.startNode("roleName");
writer.setValue(role.getRoleName());
writer.endNode();
writer.startNode("privileges");
for (Privilege privilege : role.getPrivileges()){
writer.startNode("privilege");
writer.setValue(privilege.getPrivilegeName());
writer.endNode();
}
writer.endNode();
}
它产生的xml:
<role>
<roleId>3</roleId>
<roleName>Web Administrator</roleName>
<privileges>
<privilege>Web Access</privilege>
</privileges>
</role>