2016-07-19 2 views
2

엔티티 "메시지"에 대한 XML 설명. 필드에서xStream에서 인터페이스 구현을 지정하는 방법은 무엇입니까?

<Message id="11600005" name="some_name"> 
     <sourcePartitionId>11600</sourcePartitionId> 
     <destPartitionId>11700</destPartitionId> 
     <payloadId>1300005</payloadId> 
     <sourceUdp>1045</sourceUdp> 
     <destUdp>1046</destUdp> 
     <sourceIp>10.4.48.0</sourceIp> 
     <destIp>10.4.49.0</destIp> 
     <sourcePort id="1045" name="sp_q_1045_11600_11700_005"> 
      <type>Queuing</type> 
      <maxMessageSize>8192</maxMessageSize> 
      <characteristic>1</characteristic> 
     </sourcePort> 
     <destPort id="1046" name="dp_q_1045_1046_11600_11700_005"> 
      <type>Queuing</type> 
      <maxMessageSize>8192</maxMessageSize> 
      <characteristic>1</characteristic> 
     </destPort> 
    </Message> 

sourcePortdestPort 설명과 인터페이스 ComPort 구현 개체 : SamplingPortQueuingPort : 계면에서

public interface ComPort { 

    enum PortType {Sampling, Queuing} 
    enum PortDirection {Rx,Tx} 

    public PortType getPortType(); 
    public PortDirection getPortDirection(); 

    public int getMaxMessageSize(); 
    public int getPortCharacteristic(); 

두 개의 구현들이있다. 주요 차이점 - 특성 필드. <type> 태그를 기반으로 xstream을 만드는 방법을 알려주면 해당 구현의 인스턴스가 생성됩니까?

중요한 점 : 그것은 sourcePort 태그 때 고려해야 할 필요가있다 - 방향 필드 Tx이며, destPort 태그 할 때 - 방향 필드 Rx

답변

0

이다 나는 문제 나 자신을 알아 냈어. 당신이 변환기

public static MessagesStorage unmarshallingMessages(File file){ 
     XStream xStream = new XStream(); 
     xStream.processAnnotations(new Class[]{MessagesStorage.class,Message.class}); 
     xStream.registerConverter(new ComPortConverter()); 
     return (MessagesStorage) xStream.fromXML(file); 
    } 
에게 등록해야합니다, 그리고

public class ComPortConverter implements Converter { 

    @Override 
    public void marshal(Object o, HierarchicalStreamWriter out, MarshallingContext context) { 

     ComPort comPort = (ComPort)o;  

     if (comPort.getPortDirection()== ComPort.PortDirection.Tx){ 
      out.startNode("sourcePort"); 
     }else { 
      out.startNode("destPort"); 
     } 

     out.addAttribute("id",Integer.toString(comPort.getId())); 
     out.addAttribute("name", comPort.getName()); 

     out.startNode("type"); 
     out.setValue(comPort.getPortType().name()); 
     out.endNode(); 

     out.startNode("maxMessageSize"); 
     out.setValue(Integer.toString(comPort.getMaxMessageSize())); 
     out.endNode(); 

     out.startNode("characteristic"); 
     out.setValue(Integer.toString(comPort.getPortCharacteristic()));  
     out.endNode(); 
     out.close(); 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader in, UnmarshallingContext context) { 

     ComPort result; 
     ComPort.PortDirection direction=null; 

     if (in.getNodeName().equals("sourcePort")){ 
      direction = ComPort.PortDirection.Tx; 
     }else if (in.getNodeName().equals("destPort")){ 
      direction = ComPort.PortDirection.Rx; 
     } 
     int id = Integer.parseInt(in.getAttribute("id")); 
     String name = in.getAttribute("name"); 

     in.moveDown(); 
     if (in.getValue().equals("Sampling")) result = new SamplingPort(id,name); 
     else if(in.getValue().equals("Queuing")) result = new QueuingPort(id,name); 
     else throw new IllegalArgumentException("Illegal port type value"); 
     result.setPortDirection(direction); 
     in.moveUp(); 
     in.moveDown(); 
     result.setMaxMessageSize(Integer.parseInt(in.getValue())); 
     in.moveUp(); 
     in.moveDown(); 
     result.setPortCharacteristic(Integer.parseInt(in.getValue())); 
     in.moveUp(); 

     return result; 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return ComPort.class.isAssignableFrom(type); 
    } 
} 

: 첫째, 당신은 클래스 변환기를 작성해야

관련 문제