如何序列化HashTable< String,String>使用JAXB到XML?
我正在尝试使用JAXB将 HashTable< String,String>
序列化为XML。我是Java新手(来自C#),所以我对此任务感到困惑。
I am trying to use JAXB to serialize a HashTable<String, String>
to XML. I am very new to Java (came from C#), so I am kinda perplexed by this task.
我看过以下代码:
public static <T> String ObjectToXml(T object, Class<T> classType) throws JAXBException
{
JAXBContext jaxbContext = JAXBContext.newInstance(classType);
StringWriter writerTo = new StringWriter();
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(object, writerTo); //create xml string from the input object
return writerTo.toString();
}
这样调用: ObjectToXml(o, ClassOfO.class)
,但 HashTable< String,String> .class
错误(我已经知道)。
Which is invoked like so: ObjectToXml(o, ClassOfO.class)
, but HashTable<String, String>.class
is wrong (that I already know).
那里的Java大师能告诉我如何调用这段代码吗?建议更简单的实现(当然还有调用示例)也是受欢迎的。
Can Java gurus out there show me how to invoke this code? Proposing a simpler implementation (along with an invocation example, of course) is most welcome as well.
谢谢。
您需要创建一个包装类来保留 Hashtable
:
You will need to create a wrapper class to hold onto the Hashtable
:
package forum7534500;
import java.util.Hashtable;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Wrapper {
private Hashtable<String, String> hashtable;
public Hashtable<String, String> getHashtable() {
return hashtable;
}
public void setHashtable(Hashtable<String, String> hashtable) {
this.hashtable = hashtable;
}
}
然后你可以做以下事情:
Then you can do the following:
package forum7534500;
import java.io.StringWriter;
import java.util.Hashtable;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Wrapper.class);
Wrapper wrapper = new Wrapper();
Hashtable<String, String> hashtable = new Hashtable<String,String>();
hashtable.put("foo", "A");
hashtable.put("bar", "B");
wrapper.setHashtable(hashtable);
System.out.println(objectToXml(jc, wrapper));
}
public static String objectToXml(JAXBContext jaxbContext, Object object) throws JAXBException
{
StringWriter writerTo = new StringWriter();
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(object, writerTo); //create xml string from the input object
return writerTo.toString();
}
}
这将产生以下输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wrapper>
<hashtable>
<entry>
<key>bar</key>
<value>B</value>
</entry>
<entry>
<key>foo</key>
<value>A</value>
</entry>
</hashtable>
</wrapper>
注意事项
-
JAXBContext
是一个线程安全的对象,应该创建一次并重复使用。 -
Hashtable
是同步的,如果你不需要这个,那么使用HashMap
是常见的替代品。 - 约定是以小写字母开始Java方法名称。
-
JAXBContext
is a thread-safe object and should be created once and reused. -
Hashtable
is synchronized, if you do not need this then usingHashMap
is the common replacement. - The convention is to start Java method names with a lower case letter.
自定义映射
您可以在JAXB中使用 XmlAdapter
来自定义任何类的映射。以下是我博客上帖子的链接,我将演示如何做到这一点:
You can use an XmlAdapter
in JAXB to customize the mapping of any class. Below is an link to a post on my blog where I demonstrate how to do just that:
- http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html