marshaller java 乱码_在web环境中使用JAXB技术对XML文件进行序列化和反序列化时如何避免乱码...

xml文件在本地是以UTF-8编码进行保存的,里面有一些中文字符串,通过以下反序列化代码生成了JAVA对象

JAXBContext jaxbContext ;

Object object = null ;

try {

jaxbContext = JAXBContext.newInstance(clazz);

//jaxbContext = JAXBContext.newInstance(Logic.class);

//ClassLoader classLoader = Thread.currentThread().getContextClassLoader() ;

StreamSource stremSource = new StreamSource(inputStream) ;

//反序列化

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller() ;

object = unmarshaller.unmarshal(stremSource) ;

}catch(Exception e){

e.printStackTrace();

return null ;

}

return object ;

通过观察,发现反序列化后产生的JAVA对象中的字符串属性的字符编码在WEB环境下都变成与当前JAVA执行环境所处的字符编码集,也就是说此时对象中的字符编码已变为与执行环境中的编码相同。此时如果要对对象进行序列化(即重新生成为XML文件),必须要保证序列化时设置编码属性与当前对象中的编码相同,否则保存的XML文件中就会出现乱码

String xml = null;

JAXBContext context;

ByteArrayOutputStream outputStream = null ;

try {

context = JAXBContext.newInstance(clazz);

Marshaller m = context.createMarshaller();

//m.setProperty(Marshaller.JAXB_ENCODING, encoding);

m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

//设置转换编码

m.setProperty(Marshaller.JAXB_ENCODING, charsetName);

//document level event

m.setProperty(Marshaller.JAXB_FRAGMENT, false);

if( schemaLocation != null && schemaLocation.trim()!=""){

m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaLocation);

}

outputStream = new ByteArrayOutputStream();

m.marshal(object, outputStream);

xml=outputStream.toString(charsetName);

} catch (JAXBException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(outputStream != null){

try {

outputStream.close() ;

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

return xml ;

注:通过System.getProperty("file.encoding")可以获知当前执行环境的编码。通过该属性发现有时WEB环境下和测试用例环境下编码会不一样,这就会导致有时测试正常,实际环境下运行出现乱码的原因。

总结:掌握两个原则(1)用JAXB转XML为对象时,会转对象编码为本地JAVA环境的字符编码

(2) 用JAXB转对象为XML时,默认会转为UTF-8编码,所以要保证不出乱码,转的时候应指定转为与本地JAVA环境相同的字符编码,或者保证在转的时候同时指定文件编码和转换的输出流编码一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML处理传参的对象,一般使用对象的序列化来将对象换为XML格式。对象序列化是将对象换为字节流或字符流的过程,这样就可以将对象存储到文件或在网络上传输。XML格式通常使用JAXBJava Architecture for XML Binding)库进行序列化反序列化JAXB库允许开发人员将Java换为XML格式,并且可以从XML格式反序列化Java类。以下是一个基本的Java序列化XML格式的示例代码: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import java.io.StringWriter; public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // Getters and setters public static void main(String[] args) throws Exception { Student student = new Student("Tom", 20); JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter sw = new StringWriter(); marshaller.marshal(student, sw); System.out.println(sw.toString()); } } ``` 该代码使用JAXB库将Student类序列化XML格式,并在控制台上输出XML格式的字符串。可以看到输出的XML如下: ```xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <student> <age>20</age> <name>Tom</name> </student> ``` 可以看到,JAXB库将Student类的属性换为XML格式,并且生成了根元素。反序列化,可以使用Unmarshaller对象将XML格式换为Java对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值