1. 程式人生 > >XStream註冊自定義轉換器進行型別轉換

XStream註冊自定義轉換器進行型別轉換

在物件和xml對映時候,有些型別需要我們制定格式轉換,此時就要自定義轉換器了。

下面建立一個對於Date進行轉換的一個日期轉換器。

DateConverter

package cn.framework.t1;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import com.thoughtworks.xstream.converters.ConversionException;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class DateConverter implements Converter{
	private Locale locale;
	public DateConverter(Locale locale){
		super();
		this.locale=locale;
	}
	
	//判斷需要轉換的型別
	@Override
	public boolean canConvert(Class clazz) {
		// TODO Auto-generated method stub
		return Date.class.isAssignableFrom(clazz);
	}

	//編寫java物件到xml的邏輯
	@Override
	public void marshal(Object value, HierarchicalStreamWriter writer,
			MarshallingContext context) {
		DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,this.locale);
		writer.setValue(formatter.format(value));
	}

	//編寫xml到java物件的邏輯
	@Override
	public Object unmarshal(HierarchicalStreamReader reader,
			UnmarshallingContext context) {
		GregorianCalendar calendar = new GregorianCalendar();
		DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL,this.locale);
		try{
			calendar.setGregorianChange(formatter.parse(reader.getValue()));
		}catch(ParseException e){
			throw new ConversionException(e.getMessage(),e);
		}
		return calendar.getGregorianChange();
	}

}

marshal 和 unmarshal 中寫我們自己的轉換邏輯。

接下來,把這個自定義轉換器註冊到XStream。

package cn.framework.t1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Locale;

import org.apache.log4j.Logger;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class XStreamUtils {
	private static final Logger logger=Logger.getLogger("cn.framework.t1.XStreamUtils");
	
	private static XStream xstream;
	static{
		logger.info("init xstream ...");
		xstream=new XStream(new DomDriver());
		
		/*******對生成的xml做一些設定*******/
		//設定別名,不設定將採用完全類名
		xstream.alias("User", User.class);
		xstream.alias("UserLog", UserLog.class);
		
		//設定類成員別名
		xstream.aliasField("id", User.class, "userId");
		
		//類的屬性預設為xml的元素,現在修改為xml屬性
		xstream.aliasAttribute(UserLog.class, "logId", "lid");
		xstream.useAttributeFor(UserLog.class, "logId");
		
		//只保留集合內元素,去掉上級標籤
		xstream.addImplicitCollection(User.class, "logs");
		
		//註冊自定義轉換器
		xstream.registerConverter(new DateConverter(Locale.SIMPLIFIED_CHINESE));
	}
	
	public static void objectToXML(User user) throws FileNotFoundException{
		logger.info("do objectToXML ...");
		FileOutputStream fileOutputStream = new FileOutputStream("e:/out/xstream_user.xml");
		xstream.toXML(user, fileOutputStream);
	}
	
	public static void xmlToObject() throws FileNotFoundException{
		logger.info("do xmlToObject ...");
		FileInputStream input = new FileInputStream("e:/out/xstream_user.xml");
		User user=(User) xstream.fromXML(input);
		System.out.println(user);
	}
	
	
}

使用轉換器後,序列化生成的xml:
<User>
  <id>1</id>
  <userName>aaa</userName>
  <pwd>123456</pwd>
  <UserLog lid="1">
    <ip>127.0.0.1</ip>
  </UserLog>
  <UserLog lid="2">
    <ip>127.0.0.1</ip>
  </UserLog>
  <lastVisted>2017年12月6日 星期三</lastVisted>
</User>

lastVisted 欄位格式已經改變,說明轉換成功。

相關推薦

XStream註冊定義轉換進行型別轉換

在物件和xml對映時候,有些型別需要我們制定格式轉換,此時就要自定義轉換器了。下面建立一個對於Date進行轉換的一個日期轉換器。DateConverterpackage cn.framework.t1; import java.text.DateFormat; import

python教程6--定義函式,資料型別轉換,解方程

本文主要講解點如下: 簡單函式 資料型別轉換 空函式 自定義絕對值函式 自定義函式 檢查引數型別 函式返回多個值 求解ax2 + bx + c = 0 的根 具體程式碼如下: '函式相關' __author__ = 'momo' impo

spring boot 定義配置檔案的型別轉換

配置檔案 application.yml myYml: date: 20101020 String To Date 轉換 public class StringToDateCo

Mybatis定義TypeHandler解決特殊型別轉換問題

我們知道,Java和MySQL中的資料型別是不同的,Java中除了基本資料型別,還有物件。 有時候使用MySQL儲存資料,或者從MySQL中讀取資料時,會有一些特殊需求

Struts2學習之2(請求引數的封裝,型別轉換,輸入驗證,定義攔截)

封裝請求引數 動態引數注入(請求引數,使用者輸入的) 方式一(動作類作為模型) 頁面 <form action="${pageContext.request.contextPath}/q1/login.do" method="pos

Django定義url(path)轉換

需求1: 實現一個獲取電影列表的demo,使用者可以根據/movie/電影分類/的方式來獲取電影。其中電影分類採用的是分類1+分類2+分類3...的方式拼接的,並且如果只有一個分類,那就不需要加號。示例如下: # 1. 第一種:獲取action分類下的電影 /movie/action

定義一個自己的訊息轉換

1.自定義個訊息轉換器,支援自己定義的content-type型別.首先準備好測試的controller類; @PostMapping("/") public Object test(@RequestBody UserInfo userInfo) { return

javaEE Springmvc,Converter型別轉換,對請求引數自動進行型別轉換/處理(轉成Date日期型別)

src/springmvc.xml(Springmvc核心配置檔案,配置型別轉換器,為介面卡指定轉換器): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

利用List的sort方法,定義比較對類屬性進行排序

JDK1.8之後,List新增了sort方法,使用Comparator作為引數,呼叫者可自定義比較規則。 User user1 = new User(12, "張三"); User use

Spring Boot定義攔截轉換

Spring Boot自定義攔截器和轉換器 自定義的攔截器要實現HandlerInterceptor介面,並且要將攔截器新增到Spring Boot容器中 1、使用者登陸校驗攔截器 攔截器: /** * 判斷使用者是否登陸的攔截器 * Created by Adminis

利用Collections.sort 定義比較 ,對集合元素時間進行排序

1.自定義比較器public class SortClass implements Comparator { @Override public int compare(Object arg0, Object arg1) { ProjectInfo Projec

android 時間戳與日期格式的互相轉換 以及 定義選擇

1、TimeUtils.java package com.example.classwork; import java.text.ParseException; import java.text.SimpleDateFormat; import java

定義struts2.0中的轉換(converter)

本人做的這個轉換器是幫大家認識如何最簡單的做一個自定義轉換器的 廢話不說,馬上來例子 一,先建立Simpleconverter.java動作類類 package tutorial; import com.opensymphony.xwork2.ActionSupport;

在struts2中配置定義攔截放行多個方法

return med ttr limit ring req tac cat invoke 源碼: 自定義的攔截器類: //自定義攔截器類:LoginInterceptor ; package com.java.action.interceptor; import j

JAVAEE——struts2_04:定義攔截、struts2標簽、登陸功能和校驗登陸攔截的實現

strac htm logs transacti 標識 area 返回 ftw jsp 一、自定義攔截器   1.架構      2.攔截器創建 //攔截器:第一種創建方式 //攔截器生命周期:隨項目的啟動而創建,隨項目關閉而銷毀 public class MyInt

struts2學習(6)定義攔截-登錄驗證攔截

back tps class res urn fff .com space war 需求:對登錄進行驗證,用戶名cy 密碼123456才能登錄進去;   登錄進去後,將用戶存在session中; 其他鏈接要來訪問(除了登錄鏈接),首先驗證

手機影音第六天 定義播放頁面的實現(按鈕暫時未監聽)

手機影音第六天 自定義播放器布局以及橫豎屏切換播放器時的問題解決 目前進度的項目源代碼托管在裏碼雲上,地址如下: https://git.oschina.net/joy_yuan/MobilePlayer 感興趣的可以去下載看看,多多支持

優化案例1-盡量避免使用定義函數進行大量運算

遞歸 sed clas -s bytes per pla ont har 案例說明 在月底進行代碼優化檢查過程中。在SQL檢查過程之執行次數最多的SQL。發現SQL_ID為grk7dk5amf5m7和gzzzkzbfg8j2m 在半個小時內產生大約分別15億次執行。邏輯讀

定義攔截判斷用戶是否有權限訪問

indexof mon com source ora extend ide isa att 1、關於權限系統,對於用戶是否有權限對系統進行訪問,設置自定義攔截器,來攔截用戶的請求 1 package org.slsale.interceptor; 2 3 impo

使用html5中video定義播放必備知識點總結以及JS全屏API介紹

標簽 quest htm round internet tel ren per 全屏 一、video的js知識點: controls(控制器)、autoplay(自動播放)、loop(循環)==video默認的; 自定義播放器中一些JS中提供的方法和屬性的記錄: 1、pla