سؤال

لقد قررت استخدام تسلسل XML بسيط وكان عالقا مع مشكلة أساسية. أحاول التسلسل java.util.UUID مثيل الفصل كحقل نهائي في هذه الفئة الصغيرة:

@Root
public class Identity {
    @Attribute
    private final UUID id;

    public Identity(@Attribute UUID id) {
        this.id = id;
    } 
}

درس تعليمي يوضح كيفية إجراء تسلسل كائنات تابعة لجهة خارجية عن طريق تسجيل المحولات مثل هذا:

Registry registry = new Registry();
registry.bind(UUID.class, UUIDConverter.class);
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);

serializer.write( object, stream );

المحول المناسب لـ UUID بسيط جدًا:

public class UUIDConverter implements Converter<UUID> {
    @Override
    public UUID read(InputNode node) throws Exception {
       return new UUID.fromString(node.getValue());
    }
    @Override
    public void write(OutputNode node, UUID value) throws Exception {
       node.setValue(value.toString());
    }
}

لكن هذا الرمز البسيط لم ينجح بالنسبة لي ، خلال كائنات التسلسل مع حقول UUID تم طرح استثناء تحويل الفئة java.util.uuid غير مدعوم.

لقد جربت شيئًا مشابهًا للعرف Matcher (الذي لم يكن في البرنامج التعليمي) الذي يناسبني:

Serializer serializer = new Persister(new MyMatcher());

serializer.write( object, stream );

و Matcher يبدو الفصل هكذا:

public static class MyMatcher implements Matcher {
    @Override
    @SuppressWarnings("unchecked")
    public Transform match(Class type) throws Exception {
        if (type.equals(UUID.class))
            return new UUIDTransform();
        return null;
    }
}

public class UUIDTransform implements Transform<UUID> {
    @Override
    public UUID read(String value) throws Exception {
        return UUID.fromString(value);
    }
    @Override
    public String write(UUID value) throws Exception {
        return value.toString();
    }
}

أسئلة:

  • هل المطابقة المخصصة موصى بها دائمًا الممارسة لتدفق فصول الطرف الثالث؟
  • في هذه الحالة ، يمكنني استخدام المحول؟
  • هل هناك أي دروس/أمثلة أفضل لـ XML البسيطة هناك؟

شكرًا لك.

هل كانت مفيدة؟

المحلول

يجب أن أجيب بنفسي مرة أخرى :-)

نصيحة من نيال غالاغر ، قائد مشروع XML البسيط ، من قائمة الدعم:

"يمكنك استخدام إما محول أو تحويل. أود أن أقول بالنسبة لـ UUID ، سيكون التحويل مع المطابقة هو الخيار الأسهل."

لذلك ، أنا أستخدم Transform<T>/Matcher ورضا عنها. هذا لا يغير حقيقة أن Converter<T> لا يعمل بالنسبة لي :-)

نصائح أخرى

أعتقد أن لدي إجابة على هذا.

Strategy strategy = new AnnotationStrategy();
Serializer serializer = new Persister(strategy);

يجب تسجيل المحول وحل المشكلة.

أعلم أن هذا أمر مفعم قليلاً لكن فرصتي وصلت إلى نفس الاستثناء.

القضية الفعلية هي استخدام التعليق التوضيحي attribute. إذا لم يظهر الاستثناء بدلاً من attribute ، فلا يظهر الاستثناء ويتم استخدام المحول للتسلسل.

أعتقد أنه سيعتمد بعد ذلك على التعليق التوضيحي الذي استخدمته والذي يجب عليك إنشاء محول أو استخدام حل تحويل العلامة. على الرغم من أنني لا أعرف ما إذا كان هذا هو السلوك المعترف به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top