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);
}
}
}
}
어떤 제안이나 아이디어를 해결하기위한? 미리 감사드립니다.
거의 3 년 지난입니다. –