如何序列化HashTable< String,String>使用JAXB到XML? [英] How to serialize HashTable<String, String> to XML using JAXB?

查看:140
本文介绍了如何序列化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 using HashMap 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

这篇关于如何序列化HashTable&lt; String,String&gt;使用JAXB到XML?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆