Маршалинг JAXB и дженерики

Решение: добавить в CMakeList.txt

SET_TARGET_PROPERTIES(omp1 PROPERTIES COMPILE_FLAGS "-fopenmp"
    LINK_FLAGS "-fopenmp")

P.s. omp1 - назовите ваш проект.

P.p.s. Также вы можете написать target_link_libraries(omp1 -fopenmp)

10
задан Steve Skrla 5 May 2009 в 20:17
поделиться

5 ответов

Вы можете написать собственный адаптер (не используя XmlAdapter JAXB), выполнив следующее:

1) объявите класс, который принимает все виды элементов и имеет аннотации JAXB и обрабатывает их так, как вы хотите (в моем примере я конвертирую все в String)

@YourJAXBAnnotationsGoHere
public class MyAdapter{

  @XmlElement // or @XmlAttribute if you wish
  private String content;

  public MyAdapter(Object input){
    if(input instanceof String){
      content = (String)input;
    }else if(input instanceof YourFavoriteClass){
      content = ((YourFavoriteClass)input).convertSomehowToString();
    }else if(input instanceof .....){
      content = ((.....)input).convertSomehowToString();
    // and so on
    }else{
      content = input.toString();
    }
  }
}

// I would suggest to use a Map<Class<?>,IMyObjToStringConverter> ...
// to avoid nasty if-else-instanceof things

2) используйте этот класс вместо E в вашем классе, который нужно маршалировать

ПРИМЕЧАНИЯ

  • Конечно, это не не работа со сложными (вложенными) структурами данных.
  • Вы должны подумать, как разобрать это снова, может быть сложнее. Если это слишком сложно, ждите лучшего предложения, чем мое;)
5
ответ дан 4 December 2019 в 03:39
поделиться

Таким образом, похоже, что проблема заключается в удалении E на начала и конца сопоставимо ]. Если он не может обрабатывать интерфейсы, вы можете попробовать Object , но я надеюсь, что он тоже будет жаловаться (сейчас или позже). Возможно, вы могли бы сделать Range абстрактным и специализировать его для каждого конкретного E . Я должен знать больше о JAXB.

-1
ответ дан 4 December 2019 в 03:39
поделиться

Как насчет

public class Range<**E extends Number**> implements Serializable { ...
  • Число - это класс

  • Бьюсь об заклад, JAXB знает правила по умолчанию правила маршаллинга / демаршаллинга для номера

Для отмены маршалинга для определенного типа вам нужен XmlAdapter как я здесь описано: Наследование JAXB, немаршалирование на подкласс маршалированного класса

1
ответ дан 4 December 2019 в 03:39
поделиться

Попробуйте что-то вроде Simple XML Serialization it поставляется с поддержкой универсальных типов в элементах XML с рядом аннотаций, таких как @Element и @ElementList. Модель программирования очень похожа, но проще, чем JAXB.

0
ответ дан 4 December 2019 в 03:39
поделиться

На самом деле, мне не совсем понятно, почему это не будет работать. Похоже, JAXB должен быть способен правильно разрешать определенный подтип: если (и только если!) Этот тип не является корневым типом (который он не согласно вашему описанию). Я имею в виду, это всего лишь боб; Таким образом, если боб с T заменен прямым типом работает, поэтому должна быть универсальная версия IFF с использованием подкладка для типов привязки (как это сделано в примере).

Так что, возможно, это может быть ошибка в реализации?

0
ответ дан 4 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: