【问题标题】:How can I get rid of the class attribute and perform my own conversion using XStream?如何摆脱类属性并使用 XStream 执行我自己的转换?
【发布时间】:2023-08-14 15:31:01
【问题描述】:

首先我已经阅读了link text,它并没有解决我的问题。

我正在使用带有别名的 XStream。

Condition 是一个具有多种不同实现的接口。我想删除类属性。我知道 XStream 在实现类不明确时使用类属性,并且我最多可以为一个实现类设置别名。我想一起删除类属性并使用类型属性加上其他子元素的存在来确定实现类。这可能吗?

这是我目前拥有的 XML:

<NextDestinations>
  <Connector>
    <DestinationId>2</DestinationId>
  </Connector>
  <Connector>
    <DestinationId>3</DestinationId>
    <condition class="com.orchestral.rhapsody.configuration.filter.condition.JavaScriptCondition" type="JAVASCRIPT">
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>4</DestinationId>
    <condition class="com.orchestral.rhapsody.configuration.filter.condition.MessageTypeCondition">
      <type>CONDITIONAL</type>
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>5</DestinationId>
    <condition class="com.orchestral.rhapsody.configuration.filter.condition.MessageTypeCondition">
      <type>CONDITIONAL</type>
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>6</DestinationId>
    <condition class="com.orchestral.rhapsody.configuration.filter.condition.PropertyCondition">
      <type>CONDITIONAL</type>
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>7</DestinationId>
    <condition class="com.orchestral.rhapsody.configuration.filter.condition.FieldCondition">
      <type>CONDITIONAL</type>
      ...
    </condition>
  </Connector>
  <noMatchDestination>8</noMatchDestination>
  <errorDestination>9</errorDestination>
</NextDestinations>

这是我想要的 XML:

<NextDestinations>
  <Connector>
    <DestinationId>1</DestinationId>
  </Connector>
  <Connector>
    <DestinationId>2</DestinationId>
    <condition type="JAVASCRIPT">
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>3</DestinationId>
    <condition type="CONDITIONAL">
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>4</DestinationId>
    <condition type="CONDITIONAL"
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>5</DestinationId>
    <condition type="CONDITIONAL">
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>6</DestinationId>
    <condition type="CONDITIONAL">
      ...
    </condition>
  </Connector>
  <Connector>
    <DestinationId>7</DestinationId>
    <condition type="CONDITIONAL"
      ...
    </condition>
  </Connector>
  <noMatchDestination>8</noMatchDestination>
  <errorDestination>9</errorDestination>
</NextDestinations>

【问题讨论】:

    标签: xstream


    【解决方案1】:

    我设法通过对接口的类型 [xstream.aliasType(...)] 进行别名来解决类属性问题,但是它使得它无法反序列化,因为它显然无法创建接口的实例并且具有默认类不合适。

    最终的解决方案是创建自定义转换器,这非常简单。

    【讨论】:

      【解决方案2】:

      根据您与 XStream 的联系程度,以下使用 MOXy JAXB 的方法对人们有用:

      【讨论】: