1

Java で作業している辞書スタイルのアプリケーションがあり、シリアライゼーションに Simple フレームワークを使用しています。これには文字列の ArrayList が含まれており、私が遭遇した唯一の問題は、Simple がこれらの文字列をシリアル化/逆シリアル化し、空の値を null に変更することです。この質問から、コンバーターを使用する必要があることを理解しています。私はそのページで説明されていることに従い、Sand が彼の回答に書いたクラスを追加しました (「new AnnotationStrategy()」の変更が必要でした)。取り除かれた多数の get/set メソッド):

    public class Item  {

    @ElementList(name = "itemContents")
    @Convert(SimpleXMLStringConverter.class)
    private ArrayList<String> values;

    public Item()
    {
    }
}

クラスを XML ファイルに書き込もうとすると、次のエラーが発生します。

org.simpleframework.xml.convert.ConvertException: Element annotation required for field 'values' private java.util.ArrayList main.LangComp.Item.values
    at org.simpleframework.xml.convert.ConverterScanner.getConvert(ConverterScanner.java:147)
    at org.simpleframework.xml.convert.ConverterScanner.getConvert(ConverterScanner.java:121)
    at org.simpleframework.xml.convert.ConverterScanner.getConverter(ConverterScanner.java:100)
    at org.simpleframework.xml.convert.AnnotationStrategy.write(AnnotationStrategy.java:175)
    at org.simpleframework.xml.convert.AnnotationStrategy.write(AnnotationStrategy.java:155)
    at org.simpleframework.xml.core.Source.setOverride(Source.java:394)
    at org.simpleframework.xml.core.Factory.setOverride(Factory.java:170)
    at org.simpleframework.xml.core.Composite.isOverridden(Composite.java:1387)
    at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1309)
    at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1194)
    at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1165)
    at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1071)
    at org.simpleframework.xml.core.Composite.write(Composite.java:1042)
    at org.simpleframework.xml.core.Composite.write(Composite.java:1019)
    at org.simpleframework.xml.core.Traverser.write(Traverser.java:236)
    at org.simpleframework.xml.core.CompositeList.write(CompositeList.java:248)
    at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1331)
    at org.simpleframework.xml.core.Composite.writeElement(Composite.java:1314)
    at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1194)
    at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1165)
    at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1071)
    at org.simpleframework.xml.core.Composite.write(Composite.java:1042)
    at org.simpleframework.xml.core.Composite.write(Composite.java:1019)
    at org.simpleframework.xml.core.Traverser.write(Traverser.java:236)
    at org.simpleframework.xml.core.Traverser.write(Traverser.java:208)
    at org.simpleframework.xml.core.Traverser.write(Traverser.java:186)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1187)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1169)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1147)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1266)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1248)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1229)
    at org.simpleframework.xml.core.Persister.write(Persister.java:1208)
    at main.IO.FileHandler.WriteXML(FileHandler.java:32)
    at main.UI.MainUI.formWindowClosing(MainUI.java:108)
    at main.UI.MainUI.access$000(MainUI.java:16)
    at main.UI.MainUI$1.windowClosing(MainUI.java:76)
    at java.awt.Window.processWindowEvent(Window.java:2045)
    at javax.swing.JFrame.processWindowEvent(JFrame.java:296)
    at java.awt.Window.processEvent(Window.java:2003)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Window.dispatchEventImpl(Window.java:2713)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:680)
    at java.awt.EventQueue$4.run(EventQueue.java:678)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

以前はこのプログラムを動作させることができましたが、唯一の問題は、空の文字列が null になることでした。これは回避する必要があることです。問題の原因や修正方法がわかりません。リンクした質問から得たコンバーター クラスが ArrayLists ではなく文字列用であるためですか、それとも XML ノードが文字列でありリストではないため問題ではありませんか? 「フィールドには要素の注釈が必要です」と表示されているときに、必要な注釈を理解するのに苦労しています。

4

1 に答える 1

2

@ElementList を使用していたため、エラー メッセージがスローされていました。このプロセスには @Element が必要です。ArrayLists で動作させる方法を見つけたのは、1 つのインスタンスで動作させることをあきらめ、コンバーターをすべてに適用したかったからです。それが良いアプローチかどうかはわかりませんが、うまくいきます。ここで説明されている手順に従ってRegistryStrategy を作成し、コンバーターをクラスにバインドする (受け入れない) 代わりに、それを String.class にバインドしました。つまり、シリアル化プロセスは、複雑なクラス、ArrayList などに格納されているかどうかを気にしません。文字列の場合は、null として読み取られた場合は "" に設定されます。

于 2012-02-04T23:29:55.727 に答える