"알았어, 그럼. 이미 짐작했겠지만, 그게 전부는 아니야."

"이제 JAXB의 몇 가지 다른 측면에 대해 말씀드리겠습니다. 하지만 JSON에서 했던 것처럼 컬렉션부터 시작하겠습니다."

"JAXB를 사용하여 컬렉션을 역직렬화할 때 List 변수에 사용할 특정 컬렉션(ArrayList, LinkedList, Vector 등)에 대한 불확실성도 있습니다. 그리고 이 질문에 대한 답은 주석으로 제공됩니다."

"모든 것이 매우 간단합니다. 컬렉션 유형이 주석에 지정되지 않은 경우 JAXB는 해당 유형을 사용하여 가장 적절한 컬렉션을 선택하려고 시도합니다. 목록의 경우 ArrayList가 되고 맵의 경우 HashMap 등이 됩니다. ."

"실제로 각 클래스에는 고유한 태그가 있고 태그를 사용하여 정확한 클래스를 지정할 수 있기 때문에 JSON보다 문제가 훨씬 적습니다."

"예를 들어 공통 조상을 상속하는 요소 그룹을 역직렬화해야 하는 경우 @XmlAny: 주석을 사용합니다.  "

XML에서 개체 변환
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<zoo><cat/><cat/><dog/><cat/></zoo>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class, Dog.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
개체가 XML에서 역직렬화되는 클래스
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> animals; } 
 


@XmlType(이름 = "고양이") 
@XmlRootElement 
class  Cat 
{ 
공개  문자열 이름; 공공  연령; 공개  정수 가중치; 
 
 

 고양이() 
 { 
 } 
}

@XmlType(이름 = "개") 
@XmlRootElement 
클래스  개 
{ 
공개  문자열 이름; 공공  연령; 공개  정수 가중치; 
 
 

 고양이() 
 { 
 } 

"컬렉션이 @XmlAny 주석 으로 표시되면 적절한 개체를 그 안에 넣을 수 있습니다. 그리고 JAXB Unmarshaller 는 컬렉션을 채울 때 태그에 주의를 기울입니다."

"이 경우 " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " 태그 시퀀스는 Cat, Cat, Dog 및 Cat 개체가 있는 컬렉션으로 변환됩니다. ."

"그게 내가 예상했던 것입니다."

"어허. 아, 그런데 한 가지 더. 텍스트와 태그의 혼합을 역직렬화하는 경우 @XmlMixed 주석을 사용해야 합니다."

"다음은 이러한 XML 유형의 예입니다."

@XmlMixed 주석이 필요한 샘플 XML
<data> 
<items> 
테스트 1 <item/> 텍스트 2 <item> 이름 </item> 텍스트 3 </items> </data> 

 

 

 

"와우. 그런 XML이 있다는 사실을 잊고 있었어. 모든 것이 예쁘고 태그가 포함되어 있고 그 밖의 모든 것에 익숙해졌어."

"존재합니다. 그리고 JAXB에는 이 경우에도 주석이 있습니다!"

"좋습니다. 그런데 물어보고 싶었습니다. enum은 어떻게 직렬화됩니까?"

"좋은 질문입니다! 잘 봤습니다! 그 주제는 어떻게든 건너뛰었습니다."

"열거형을 표시하는 데 사용해야 하는 특별한 @XmlEnum 주석이 있습니다. 값을 숫자 또는 문자열로 저장할지 여부를 지정하는 데 사용할 수 있습니다."

"특정 enum 필드에 해당하는 값을 지정할 수 있는 @XmlEnumValue 주석도 있습니다."

"여기 몇 가지 예가 있어요:"

숫자 문자열
@XmlType
@XmlEnum(Integer.class)
public enum Code
{
 @XmlEnumValue("1")
  START,

 @XmlEnumValue("2")
  INPROGRESS,

 @XmlEnumValue("3")
  FINISH

 @XmlEnumValue("-1")
  ERROR
}
@XmlType
@XmlEnum(String.class)
public enum Card
{
 @XmlEnumValue("Spade")
  CLUBS,

 @XmlEnumValue("Diamond")
  DIAMONDS,

 @XmlEnumValue("Heart")
  HEARTS,

 @XmlEnumValue("Club")
  SPADES
}

"Holy moly. 이게 어디에 필요할지 상상이 안 되지만 매우 유용하다고 생각합니다. 그리고 가장 중요한 것은 표준 문자열이나 숫자 값에 집착할 필요가 없다는 것입니다."

"예. 예를 들어 Facebook 서버와 메시지를 교환하는 프로그램을 작성하고 할당된 값 집합이 있는 경우에 편리합니다. 자신의 열거형에 할당하기만 하면 모든 것이 작동합니다. "

"멋지네요. 저는 확실히 JAXB를 좋아합니다."

"좋아. 그럼 오늘은 여기까지. 가서 쉬어."