0

Xstream 1.3 を 1.4 にアップグレード中です。ただし、生成された JSON が正しくないことがわかりました。これを解決するために何をする必要があるかわかりません。JUNIT テストを作成し、問題を再現できました。ここにテスト用のコードがあります

public class XstreamTest {

     @Test
        public void testXstreamStuffForBasicVO(){
            BasicVO basicVO = new BasicVO("atttr1", "attr2");
            XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
            //XStream xstream = new XStream(new JettisonMappedXmlDriver());
            xstream.setMode(XStream.NO_REFERENCES);
            xstream.registerConverter(new BasicVOConverter());
            System.out.println(xstream.toXML(basicVO));
            //return setupXstream(xstream);
        }

         class BasicVO{
             @XStreamAlias("alias1")
             private String attribute1;

             @XStreamAlias("alias2")
             private String attribute2;

             BasicVO(String att1, String att2){
                 setAttribute1(att1);
                 setAttribute2(att2);
             }

             BasicVO(){

             }

            public String getAttribute1() {
                return attribute1;
            }

            public void setAttribute1(String attribute1) {
                this.attribute1 = attribute1;
            }

            public String getAttribute2() {
                return this.attribute2;
            }

            public String getAttribute3(){
                return "madeupAttribute";
            }

            public void setAttribute2(String attribute2) {
                this.attribute2 = attribute2;
            }

         }


         class BasicVOConverter implements Converter{

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

            @Override
            public void marshal(Object source, HierarchicalStreamWriter writer,
                    MarshallingContext context) {


                BasicVO basicVO = (BasicVO) source;

                writer.startNode("property1");
                writer.setValue(basicVO.getAttribute1());
                writer.endNode();

                writer.startNode("property2");
                writer.setValue(basicVO.getAttribute2());
                writer.endNode();

                writer.startNode("property3");
                writer.setValue(basicVO.getAttribute3());
                writer.endNode();

            }

            @Override
            public Object unmarshal(HierarchicalStreamReader reader,
                    UnmarshallingContext context) {
                    BasicVO person = new BasicVO();

                    reader.moveDown();
                    person.setAttribute1(reader.getValue());
                    reader.moveUp();

                    reader.moveDown();
                    person.setAttribute2(reader.getValue());
                    reader.moveUp();


                    return person;
            }

         }
}

生成される出力は次の無効な JSON です (値が二重引用符で囲まれていないため無効です)。

{"com.xyz.XstreamTest$BasicVO": {
  "property1": atttr1,
  "property2": attr2,
  "property3": madeupAttribute
}}

JettisonMappedXmlDriver を使用する場合、これは問題ではありませんが、JsonHierarchicalStreamDriver で取得した他の重要なものが失われるため、これを使用することはできません。

Xstream 1.3 では、次のようになります。

 {"com.xyz.XstreamTest$BasicVO": {
      "property1": "atttr1",
      "property2": "attr2",
      "property3": "madeupAttribute"
    }}

Xstream 1.4 と 1.3 のコードを調べたところ、大きな違いが見つかりました。また、引用符のロジックの適用方法にも違いがあることがわかりました。1.3 では、引用符がより一般的に追加されます。ただし、1.4 では、引用符は「文字列」タイプにのみ追加されます。これがどのように決定されるかはわかりません。

xstream 1.4 コードに何らかのバグがある可能性がありますか? これはあまりにも大げさなようです。おそらくいくつかのステップが欠けています。誰でもこれを解決するのを手伝ってもらえますか? ありがとう

4

1 に答える 1

0

これは現在のバグのようで、次のリリースで修正される予定です

https://jira.codehaus.org/browse/XSTR-728

ありがとう

于 2013-03-12T22:59:06.497 に答える