2011-06-28 2 views
1

ルック:Jaxbは内部クラスをマーシャリングする必要がありますか?私はXSDのこの作品を持って

<xs:complexType name="ResourcesType"> 
    <xs:sequence> 
     <xs:element name="Classrooms"> 
     <xs:complexType mixed="true"> 
      <xs:sequence> 
      <xs:element type="ResourceType" name="Resource" maxOccurs="unbounded" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     <xs:element name="Teachers"> 
     <xs:complexType mixed="true"> 
      <xs:sequence> 
      <xs:element type="ResourceType" name="Resource" maxOccurs="unbounded" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     <xs:element name="Classes"> 
     <xs:complexType mixed="true"> 
      <xs:sequence> 
      <xs:element type="ResourceType" name="Resource" maxOccurs="unbounded" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     <xs:element name="Special"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
      <xs:enumeration value="0"/> 
      <xs:enumeration value=""/> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 

私は、Eclipseプラグインを使用してスキーマからクラスを生成し、私はこれだ:ClassesClassRoomsTeachers内部クラスで

ResourcesTypeクラスを。 このすべての内部クラスで私はList<Serializable>コンテンツフィールドを保護しています。 通常のクラスとしてClassesType,ClassRoomsTypeおよびTeachersTypeも生成されました。

なぜこの内部クラスが生成されましたか?他のクラスがシリアライズ可能でない場合、このListをどのように設定するのですか?

はあなたにこの内部クラスを作成したのはなぜ
敬具

答えて

3

ありがとうございましたか!

JAXBの実装は、匿名の複合型の内部クラスです。これは、生成されたクラスの名前の競合の可能性を減らすために行われます。他の クラスが直列化可能でない場合、私は、このリストを設定する方法を

<xs:complexType name="ResourcesType"> 
    <xs:sequence> 
     <xs:element name="Classrooms"> 
     <xs:complexType mixed="true"> 
      <xs:sequence> 
      <xs:element type="ResourceType" name="Resource" maxOccurs="unbounded" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     ... 
    </xs:sequence> 

    </xs:complexType> 

 


content財産の許可内容はJAXBElement<ResourceType>Stringです。 Serializableは、どちらのタイプにも共通のインターフェイスで、Objectより少し制限があります。

package example; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Marshaller; 
import javax.xml.namespace.QName; 

import example.ResourcesType.Classrooms; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     // This is the ObjectFactory that was generated by XJC 
     ObjectFactory objectFactory = new ObjectFactory(); 

     // You can instantiate objects using the constructors 
     ResourcesType resourcesType = new ResourcesType(); 

     // You can instantiate objects using the ObjectFactory 
     Classrooms classRooms = objectFactory.createResourcesTypeClassrooms(); 
     resourcesType.setClassrooms(classRooms); 

     // You can use the ObjectFactory to wrap an object in a JAXBElement 
     ResourceType resourceType1 = new ResourceType(); 
     JAXBElement<ResourceType> jaxbElement1 = objectFactory.createResourcesTypeClassesResource(resourceType1); 
     classRooms.getContent().add(jaxbElement1); 

     ResourceType resourceType2 = objectFactory.createResourceType(); 
     JAXBElement<ResourceType> jaxbElement2 = objectFactory.createResourcesTypeClassesResource(resourceType2); 
     classRooms.getContent().add(jaxbElement2); 

     // You can create a JAXBContext on the package name of your generated classes 
     JAXBContext jc = JAXBContext.newInstance("example"); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     // You can also create an instance of JAXBElement without using the ObjectFactory 
     JAXBElement<ResourcesType> rootElement = new JAXBElement<ResourcesType>(new QName("root"), ResourcesType.class, resourcesType); 
     marshaller.marshal(rootElement, System.out); 
    } 

} 
+0

はい]を、私はこのリストにオブジェクトを追加する方法を:

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "content" }) public static class Classes { @XmlElementRef(name = "Resource", type = JAXBElement.class) @XmlMixed protected List<Serializable> content; /** * Gets the value of the content property. * * <p> * This accessor method returns a reference to the live list, * not a snapshot. Therefore any modification you make to the * returned list will be present inside the JAXB object. * This is why there is not a <CODE>set</CODE> method for the content property. * * <p> * For example, to add a new item, do as follows: * <pre> * getContent().add(newItem); * </pre> * * * <p> * Objects of the following type(s) are allowed in the list * {@link JAXBElement }{@code <}{@link ResourceType }{@code >} * {@link String } * * */ public List<Serializable> getContent() { if (content == null) { content = new ArrayList<Serializable>(); } return this.content; } } 

UPDATE

次の例では、役立つかもしれませんか?私の型でシリアライズ可能を実装するか、リストを自分のResourceTypeに変更する必要がありますか? – Felipe

+1

@ user819285 - 'ResourceType'のインスタンスを' JAXBElement'のインスタンスにラップしてからListに追加する必要があります。 –

+0

?どうしますか?私は初心者です。 – Felipe

関連する問題