1

XStream 1.4.2를 사용하여 일시적 일 수있는 필드를 비 직렬화해야한다는 요구 사항에 직면했습니다. 그럼에도 불구하고 그러한 필드에는 @XStreamAlias@XStreamAsAttribute이 모두 표시 될 수 있습니다. 그래, 나도 알아, 이상하게 들리지만 이것은 나쁜 디자인의 지표이다. 그러나 이것이 내가 현재 가지고있는 것이다. XStream은 사용자 지정 변환기를 지정하는 방법을 제공하므로 XStream에서 직렬화를 허용하도록 만드는 모든 일시적인 필드를 생략하는 기본 방법을 무시하기 위해 com.thoughtworks.xstream.converters.reflection.ReflectionConverter을 확장하려고했습니다. 그러나, 나는 완전히 그런 변환기를 구현하기 위해 두 가지 아이디어를 가지고 붙어 있지만, 그들 중 누구도 작동합니다. 그래서 여기 내가 뭘하려 :XStream 1.4.2로 과도 필드 비 직렬화

1 차 방법은 작동하지 않습니다

public final class TransientSimpleConverter extends ReflectionConverter { 

    private final Class<?> type; 

    private TransientSimpleConverter(Class<?> type, Mapper mapper, ReflectionProvider reflectionProvider) { 
     super(mapper, reflectionProvider); 
     this.type = type; 
    } 

    public static TransientSimpleConverter transientSimpleConverter(Class<?> type, XStream xStream) { 
     return new TransientSimpleConverter(type, xStream.getMapper(), xStream.getReflectionProvider()); 
    } 

    @Override 
    protected boolean shouldUnmarshalTransientFields() { 
     return true; 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return this.type == type; 
    } 

} 

제 2 방법 중 하나가 작동하지 않습니다

public final class TransientComplexConverter extends ReflectionConverter { 

    private final Class<?> type; 

    private TransientComplexConverter(Class<?> type, Mapper mapper, ReflectionProvider provider) { 
     super(mapper, provider); 
     this.type = type; 
    } 

    public static TransientComplexConverter transientComplexConverter(Class<?> type, Mapper mapper, Iterable<String> fieldNames) { 
     return new TransientComplexConverter(type, mapper, TransientHackReflectionProvider.transientHackReflectionProvider(type, fieldNames)); 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return this.type == type; 
    } 

    private static final class TransientHackReflectionProvider extends PureJavaReflectionProvider { 

     private final Class<?> type; 
     private final Collection<Field> allowedFields; 
     private final Collection<String> allowedAliases; 

     private TransientHackReflectionProvider(Class<?> type, Collection<Field> allowedFields, Collection<String> allowedAliases) { 
      this.type = type; 
      this.allowedFields = allowedFields; 
      this.allowedAliases = allowedAliases; 
     } 

     public static TransientHackReflectionProvider transientHackReflectionProvider(final Class<?> type, Iterable<String> fieldNames) { 
      final Collection<Field> allowedFields = from(fieldNames).transform(new Function<String, Field>() { 
       @Override 
       public Field apply(String name) { 
        return field(type, name); 
       } 
      }).toList(); 
      final Collection<String> allowedAliases = transform(allowedFields, new Function<Field, String>() { 
       @Override 
       public String apply(Field f) { 
        return f.getName(); 
       } 
      }); 
      return new TransientHackReflectionProvider(type, allowedFields, allowedAliases); 
     } 

     @Override 
     protected boolean fieldModifiersSupported(Field field) { 
      return allowedFields.contains(field) ? true : super.fieldModifiersSupported(field); 
     } 

     @Override 
     public boolean fieldDefinedInClass(String fieldName, Class type) { 
      return type == this.type && allowedAliases.contains(fieldName) ? true : super.fieldDefinedInClass(fieldName, type); 
     } 

     private static final Field field(Class<?> type, String name) { 
      try { 
       final Field field = type.getDeclaredField(name); 
       checkArgument(isTransient(field.getModifiers()), name + " is not transient"); 
       checkArgument(field.getAnnotation(XStreamAsAttribute.class) != null, name + " must be annotated with XStreamAsAttribute"); 
       checkArgument(field.getAnnotation(XStreamAlias.class) != null, name + " must be annotated with XStreamAlias"); 
       return field; 
      } catch (final SecurityException ex) { 
       throw new RuntimeException(ex); 
      } catch (final NoSuchFieldException ex) { 
       throw new RuntimeException(ex); 
      } 
     } 

    } 

} 

어떤 제안이나 아이디어를 해결하기위한? 미리 감사드립니다.

답변

0

이 게시물은 오래된 것으로 알고 있지만 누군가는 여전히 관심이 있습니다. 내 솔루션 : 나는 더 이상 이상한 프로젝트로 작업하지 않고, 불행하게도 솔루션을 확인할 수는 없지만, 어쨌든 답변을 첫 번째 사람이되는 입력 주셔서 감사 이후

XStream xstream = new XStream(new MyPureJavaReflectionProvider()); 

class MyPureJavaReflectionProvider extends PureJavaReflectionProvider { 

    public MyPureJavaReflectionProvider() { 
     this(new FieldDictionary(new ImmutableFieldKeySorter())); 
    } 

    public MyPureJavaReflectionProvider(FieldDictionary fieldDictionary) { 
     super(fieldDictionary); 
    } 

    protected boolean fieldModifiersSupported(Field field) { 
     int modifiers = field.getModifiers(); 
     return !Modifier.isStatic(modifiers); 
    } 

    public boolean fieldDefinedInClass(String fieldName, Class type) { 
     Field field = fieldDictionary.fieldOrNull(type, fieldName, null); 
     return field != null && fieldModifiersSupported(field); 
    } 

} 
+0

거의 3 년 지난입니다. –