【问题标题】:Xml Serializer and Deserializer with object带有对象的 Xml 序列化器和反序列化器
【发布时间】:2011-01-29 09:09:41
【问题描述】:

在 Dot Net XmlSerializer 对象到 xml 和 Deserializer 中将 xml 标签转换为对象 -- 在java中怎么做?

public static object ConvertToObject(Type objectType,String strxml)
{
  try
  {
    Object obj=null;
    XmlSerializer xs=new XmlSerializer(objectType);
    obj=xs.Deserializer(new StringReader(strxml));
    return obj;
  }
  catch(Exception e)
  {
  }

//Xml serialized with ihuti java and converted to xml by argobj 
public static object ConvertFromObject(ihutidata argobj)//ihuti.java with xml elements
{
  try
  {
    XmlWriterSettings Sett=new XmlWritterSettings();
    settings.OmitXmlDeclaration=true;

    StringBuilder builder=new StringBuilder();
    XmlSerializer xs=new XmlSerializer(typeof(ihutidata));
    XmlWriter xw=XmlWriter.Create(builder,settings);

    xs.Serialize(xw,argobj);
    xw.close();

    return (builder.ToString());
  }
  catch(Exception e)
  {
    return("Exception"+e);
  }
internal string savetodb(TSring argdata,string argclientip)
{
  ihutidata req=(ihutidata)DataProcessing.ConvertToObject(typeof(ihutidata),argdata);

  if(req!=null)
  {
    ......
    ......
  }
}

是的,我同意 XStream 将 xml 转换为对象,反之亦然,但我的问题是.... 我必须用类调用 converttoobject() 并将其作为对象传递。 由于程序仍在 C# 中,我正在 java 中执行相同的过程。

ihutidata 是一个包含 xml 根元素、属性和元素等的类。 Java有可能吗?

【问题讨论】:

  • 看来我不明白您需要做什么。 ConvertToObject - 是 xstream.fromXML 所做的; ConvertFromObject 看起来像 xstream.toXML; “我必须通过引用一个来调用两者” - 你是什么意思?
  • 你终于知道我必须像这样调用 Ex : ihutidata req=(inhutidata)DataProcessing.ConvertToObject(typeof(ihutidata),argdata);//ihutidata 是一个包含 xmlelements 和属性的类在同一个包中访问。

标签: java web-services netbeans jax-ws


【解决方案1】:

有很多库可以完成这项工作(序列化和反序列化对象),最简单的使用之一是XStreamhere 是使用示例:

Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));

现在你可以简单地运行String xml = xstream.toXML(joe);,结果是:

<person>
  <firstname>Joe</firstname>
  <lastname>Walnes</lastname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
  <fax>
    <code>123</code>
    <number>9999-999</number>
  </fax>
</person>

要让对象返回运行Person newJoe = (Person)xstream.fromXML(xml);

另一个可能的选项是JAXB,来自wikipedia

用于 XML 绑定的 Java 架构 (JAXB) 允许 Java 开发人员映射 Java 类到 XML 表示。 JAXB 提供了两个主要功能: 将 Java 对象编组为 XML 和相反,即解组 XML 回到 Java 对象。其他 换句话说,JAXB 允许存储和 以任何 XML 检索内存中的数据 格式,无需实现 一组特定的 XML 加载和 保存程序的例程 类结构。它类似于 .Net 中的 xsd.exe 和 xmlserializers 框架。

但就我而言,大多数任务都可以使用 XStream 完成,它轻量级且更容易(恕我直言)

【讨论】:

    【解决方案2】:

    你可以看看XStream

    【讨论】:

    • 它将对象序列化为 XML 并将 XML 反序列化回对象。
    【解决方案3】:

    在 Java 中有 XMLEncoder

    您的方法将类似于:

    public static <T> T convertToObject(Class<T> objectType, String xml) {
        XMLDecoder decoder = new XMLDecoder(new ReaderInputStream(new StringReader(xml)));
        T result = (T) decoder.readObject();
        decoder.close();
        return result;
    }
    
    public static String convertToString(Object object) {
        StringWriter sw = new StringWriter();
        XMLEncoder encoder = new XMLEncoder(new WriterOutputStream(sw));
        encoder.writeObject(object);
        encoder.close();
        return sw.toString();
    }
    

    (注意ReaderOutputStream来自apache commons-io)

    【讨论】:

    • 我不能使用对象类型的 xml 编码器或解码器作为参数
    • 因为它在从其他函数传递时不接受 Typeof() 和 Type 数据类型。
    • @RSR 我不明白那个评论。什么是 Typeof?什么是“类型数据类型”
    • 我在上面显示了完整的代码,你可以看到 typeof() 用于在序列化时引用包含 xmlelement 属性的类,而 Type 用于访问类对象
    • 我已经按照您的 xmlencoder 代码进行了操作,但是出现异常并且它不会移动到其他函数 java.lang.Exception: Unrecognized opening tag: soap:Envelope xmlns:soap="w3.org/2003/05/soap-envelope" xmlns :ihut="hutiamdps.com/IHutiGprsModem" 继续 ... java.lang.Exception: 无法识别的开始标签:soap:Header 继续 ... java.lang.Exception: 无法识别的结束标签: autoip 继续 ... 字符串文件:SaveToDB 异常: java.util.NoSuchElementException BUILD SUCCESSFUL(总时间:0 秒)
    猜你喜欢
    • 1970-01-01
    • 2018-07-11
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多