Java Bean 직렬화의 이름 및 형식에 대한 제어?

Dov

XMLEncoder를 사용하여 빠른 직렬화 루틴을 작성하고 다음 XML을 얻었습니다.

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_25" class="java.beans.XMLDecoder">
 <object class="edu.stevens.Test">
  <void property="id">
   <int>1</int>
  </void>
  <void property="name">
   <string>Fred</string>
  </void>
 </object>
</java>

더 간결한 것은 말할 것도없고 더 의미있는 태그를 정의하고 싶습니다. 이 같은:

<Test>
  <id>1</id>
  <name>Fred</name>
</Test>

한 번 파일에 패키지 이름을 포함하는 것을 신경 쓰지 않을 것이지만, 크기가 커질 수 있기 때문에 매번 복제되는 것은 원하지 않습니다.

분명히 직렬화를 통해 작업을 수행 한 다음 나중에 XSLT 변환 단계를 실행할 수 있지만 속도가 느리고 번거 롭습니다.

객체에 대한 태그 매핑을 정의 할 수있는 방법이 있다면 이것이 제 최고의 선택입니다. 그렇지 않은 경우 작동하는 다른 XML 직렬화 도구가 있습니까?

일반적으로 다음과 같은 객체를 포함하는 객체가 필요합니다.

<Quiz>
  <id>1</id>
  <name>foo</name>
  <Question>
    <id>1</id>
    <text>What kind of question is this?</text>
    <audio>foo.mp3</audio>
    <MultipleChoice>
      <Answer correct="t">rhetorical</Answer>
      <Answer>stupid</Answer>
      <Answer>funny</Answer>
    </MultipleChoice>
    <text>another part to this question, what is 2+2?</text>
    <Fillin>
      <id>2</id>
    </Fillin>
  </Question>
</Quiz>

속성으로 직렬화하는 것을 선호합니다.

하지만 더 어렵다면 큰 문제가 아닙니다.

니콜라스 알버트

여기 XML로 /에서 사용자 정의 직렬화 / 역 직렬화 샘플이 있습니다.

여기에서 코드 실행 : http://ideone.com/H3oHBn

import java.io.StringWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class CustomSaveLoad {

    static class Container {
        Container Container1;
        Container Container2;
        AnotherContainer AnotherContainer;
        String name;
    }

    static class AnotherContainer {
        String name;
        int value;
    }

    static Document save(Object obj) throws Exception {
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

        save(obj, obj.getClass().getSimpleName(), doc, doc);

        return doc;
    }

    static void save(Object obj, String name, Node parent, Document doc) throws Exception {     
        Class<?> objCls = obj.getClass();

        Element elt = doc.createElement(name);
        parent.appendChild(elt);
        if (objCls.getCanonicalName().startsWith(CustomSaveLoad.class.getSimpleName())) {
            for (Field field : objCls.getDeclaredFields()) {
                Object value = field.get(obj);
                if (value != null) {
                    save(value, field.getName(), elt, doc);
                }
            }
        } else {
            elt.setTextContent(obj.toString());
        }
    }

    static <E> E load(Document doc, Class<E> cls) throws Exception {
        Element elt = doc.getDocumentElement();
        E obj = cls.newInstance();
        load(obj, elt);
        return obj;
    }

    static void load(Object obj, Element elt) throws Exception {
        Class<?> cls = obj.getClass();
        NodeList children = elt.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
                Element childElt = (Element) children.item(i);
                Field field = cls.getDeclaredField(childElt.getTagName());
                Class<?> childCls = field.getType();
                if (childCls.getCanonicalName().startsWith(CustomSaveLoad.class.getSimpleName())) {
                    Object childObj = childCls.newInstance();
                    field.set(obj, childObj);
                    load(childObj, childElt);
                } else {
                    String value = childElt.getTextContent();
                    if (childCls == String.class) {
                        field.set(obj, value);
                    } else {
                        childCls = toWrapper(childCls);
                        Method method = childCls.getMethod("valueOf", String.class);
                        field.set(obj, method.invoke(null, value));
                    }
                }
            }
        }
    }

    static Class<?> toWrapper(Class<?> cls) {
        if (cls.isPrimitive()) {
            if (Integer.TYPE == cls) {
                cls = Integer.class;
            } else if (Double.TYPE == cls) {
                cls = Double.class;
            }
        }
        return cls;
    }

    public static void main(String[] args) throws Exception {
        Container rootContainer = new Container();
        rootContainer.name = "root";
        rootContainer.Container1 = new Container();
        rootContainer.Container1.name = "root.c1";
        rootContainer.Container2 = new Container();
        rootContainer.Container2.name = "root.c2";
        rootContainer.AnotherContainer = new AnotherContainer();
        rootContainer.AnotherContainer.name = "root.c3";
        rootContainer.AnotherContainer.value = 42;
        rootContainer.Container2.AnotherContainer = new AnotherContainer();
        rootContainer.Container2.AnotherContainer.name = "root.c2.c3";
        rootContainer.Container2.AnotherContainer.value = 21;

        Document doc = save(rootContainer);

        StreamResult result = new StreamResult(new StringWriter());
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        transformerFactory.setAttribute("indent-number", 2);
        Transformer transform = transformerFactory.newTransformer();
        transform.setOutputProperty(OutputKeys.INDENT, "yes");
        transform.transform(new DOMSource(doc), result);

        String xml = result.getWriter().toString();

        System.out.println("Saved to xml:");
        System.out.println(xml);

        Container loadedContainer = load(doc, Container.class);
        System.out.println(loadedContainer.Container2.AnotherContainer.value);
    }

}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

분류에서Dev

제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

분류에서Dev

자식 개체 및 형제 개체에서 개체 이름이 동일한 XML Serializer를 사용하여 개체를 직렬화 할 수 없습니다.

분류에서Dev

XML 직렬화 오류에 대한 요소 이름 제공

분류에서Dev

Java에서 인터페이스 직렬화 및 역 직렬화

분류에서Dev

형식에 대한 제약 조건이있는 제네릭의 C # 이름

분류에서Dev

이상한 Java 직렬화 문제

분류에서Dev

@ 기호 뒤의 숫자에 대한 Java 및 Javascript Regex 형식

분류에서Dev

Java의 Jackson JSON 직렬화-속성 이름에 중첩되는 대신 루트에 k / v 쌍 쓰기

분류에서Dev

다양한 API 레벨에서 Java 직렬화 및 역 직렬화

분류에서Dev

Wordpress의 배열에서 직렬화 해제 및 데이터 호출

분류에서Dev

Java 직렬화 / 역 직렬화에 대한 안전한 json

분류에서Dev

사용자 지정 클래스의 개체에 대한 NSMutableArray의 직렬화 및 역 직렬화

분류에서Dev

재귀 및 반사를 사용한 JSON 직렬화. (어레이 문제)

분류에서Dev

ProtoBuf 필드의 컬렉션에 대한 Kryo 직렬화 문제

분류에서Dev

Java 직렬화에 대한 설명

분류에서Dev

오류 속성 : class Bean 클래스의 완전한 이름 (하위 Bean 정의에 대한 상위 정의로만 제공되는 경우 제외)

분류에서Dev

어떻게 직렬화 및 역 직렬화 IGraphServiceClient 클라이언트 객체에?

분류에서Dev

직렬화 향상-다른 네임 스페이스의 단일 데이터 유형에 대한로드 및 저장 메소드 사용

분류에서Dev

차단 대기열 및 SocketChannel 쓰기에 대한 흐름 제어

분류에서Dev

Java의 파일 이름에 대한 정규식 표현식

분류에서Dev

개체에 대한 본문 및 특성이있는 태그 역 직렬화

분류에서Dev

히브리어 문자에 대한 UITextView의 이상한 형식

분류에서Dev

Hazelcast의 DataSerializable writeData 및 readData에 대한 직렬화 단위 테스트

분류에서Dev

연결된 목록 및 목록에 대한 포인터의 중복 직렬화

분류에서Dev

비트 크기 정의를 사용한 Java 사용자 정의 직렬화 및 역 직렬화

분류에서Dev

SAAJInInterceptor 및 WSS4JInInterceptor Bean에 대한 Java 구성

분류에서Dev

Java Bean 및 JSF 형식화 날짜 목록

분류에서Dev

파일에 대한 데이터 직렬화 / 역 직렬화

Related 관련 기사

  1. 1

    제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

  2. 2

    제네릭 형식의 XmlElement 이름을 사용한 XML 직렬화-C #

  3. 3

    자식 개체 및 형제 개체에서 개체 이름이 동일한 XML Serializer를 사용하여 개체를 직렬화 할 수 없습니다.

  4. 4

    XML 직렬화 오류에 대한 요소 이름 제공

  5. 5

    Java에서 인터페이스 직렬화 및 역 직렬화

  6. 6

    형식에 대한 제약 조건이있는 제네릭의 C # 이름

  7. 7

    이상한 Java 직렬화 문제

  8. 8

    @ 기호 뒤의 숫자에 대한 Java 및 Javascript Regex 형식

  9. 9

    Java의 Jackson JSON 직렬화-속성 이름에 중첩되는 대신 루트에 k / v 쌍 쓰기

  10. 10

    다양한 API 레벨에서 Java 직렬화 및 역 직렬화

  11. 11

    Wordpress의 배열에서 직렬화 해제 및 데이터 호출

  12. 12

    Java 직렬화 / 역 직렬화에 대한 안전한 json

  13. 13

    사용자 지정 클래스의 개체에 대한 NSMutableArray의 직렬화 및 역 직렬화

  14. 14

    재귀 및 반사를 사용한 JSON 직렬화. (어레이 문제)

  15. 15

    ProtoBuf 필드의 컬렉션에 대한 Kryo 직렬화 문제

  16. 16

    Java 직렬화에 대한 설명

  17. 17

    오류 속성 : class Bean 클래스의 완전한 이름 (하위 Bean 정의에 대한 상위 정의로만 제공되는 경우 제외)

  18. 18

    어떻게 직렬화 및 역 직렬화 IGraphServiceClient 클라이언트 객체에?

  19. 19

    직렬화 향상-다른 네임 스페이스의 단일 데이터 유형에 대한로드 및 저장 메소드 사용

  20. 20

    차단 대기열 및 SocketChannel 쓰기에 대한 흐름 제어

  21. 21

    Java의 파일 이름에 대한 정규식 표현식

  22. 22

    개체에 대한 본문 및 특성이있는 태그 역 직렬화

  23. 23

    히브리어 문자에 대한 UITextView의 이상한 형식

  24. 24

    Hazelcast의 DataSerializable writeData 및 readData에 대한 직렬화 단위 테스트

  25. 25

    연결된 목록 및 목록에 대한 포인터의 중복 직렬화

  26. 26

    비트 크기 정의를 사용한 Java 사용자 정의 직렬화 및 역 직렬화

  27. 27

    SAAJInInterceptor 및 WSS4JInInterceptor Bean에 대한 Java 구성

  28. 28

    Java Bean 및 JSF 형식화 날짜 목록

  29. 29

    파일에 대한 데이터 직렬화 / 역 직렬화

뜨겁다태그

보관