xsd2code создает дополнительную вложенную коллекцию при сериализации списков

Я использую xsd2code v3.4. Пока я довольно близок к тому, чтобы заставить его работать, однако я столкнулся с одной вопиющей проблемой и, похоже, не могу найти никаких решений. Когда мой XML генерируется после того, как я сериализовал свой объект, он добавляет дополнительный сложный тип, который назван точно так же, как класс. Это то, что я сейчас получаю. Обратите внимание, как он добавляет ненужную коллекцию сразу после строки заказа:

<?xml version="1.0" encoding="utf-8"?>
<CORE_PO_INBOUND_V2 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <INTEGRATION_MESSAGE_CONTROL>
    <ACTION>FULL_UPDATE</ACTION>
    <COMPANY_CODE>COMPANY</COMPANY_CODE>
    <ORG_CODE>COMPANY</ORG_CODE>
    <MESSAGE_TYPE>INBOUND_ENTITY_INTEGRATION</MESSAGE_TYPE>
    <USERID>COMPANY</USERID>
    <RECEIVER>TA15</RECEIVER>
    <SENDER>COMPANY</SENDER>
    <BATCH_ID>1234</BATCH_ID>
    <BUS_KEY>
      <ORG_CODE>COMPANY</ORG_CODE>
      <PO_NUMBER>1234</PO_NUMBER>
    </BUS_KEY>
  </INTEGRATION_MESSAGE_CONTROL>
  <PURCHASE_ORDER_HEADER>
    <CTRY_OF_EXPORT>TR</CTRY_OF_EXPORT>
    <CTRY_OF_IMPORT>US</CTRY_OF_IMPORT>
    <CURRENCY_CODE>USD</CURRENCY_CODE>
    <INCOTERM_CODE>011</INCOTERM_CODE>
    <ORG_CODE>COMPANY</ORG_CODE>
    <SOURCE_TX_ID>THING</SOURCE_TX_ID>
    <PO_NUMBER>1234</PO_NUMBER>
    <PURCHASE_ORDER_LINE>
      <CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE>
        <BUSINESS_UNIT>BCA</BUSINESS_UNIT>
        <COMMERCIAL_UOM>EA</COMMERCIAL_UOM>
        <CTRY_OF_IMPORT>US</CTRY_OF_IMPORT>
        <CURRENCY_CODE>USD</CURRENCY_CODE>
        <DEPARTMENT>602</DEPARTMENT>
        <LINE_ID>1</LINE_ID>
      </CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE>
    </PURCHASE_ORDER_LINE>
    <PURCHASE_ORDER_HEADER_PARTNER>
      <CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_HEADER_PARTNER>
        <REF_RESOLUTION_PARTNER>Stuff</REF_RESOLUTION_PARTNER>
      </CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_HEADER_PARTNER>
    </PURCHASE_ORDER_HEADER_PARTNER>
  </PURCHASE_ORDER_HEADER>
</CORE_PO_INBOUND_V2>

Это то, что я на самом деле хочу:

<?xml version="1.0" encoding="utf-8"?>
<CORE_PO_INBOUND_V2 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <INTEGRATION_MESSAGE_CONTROL>
    <ACTION>FULL_UPDATE</ACTION>
    <COMPANY_CODE>COMPANY</COMPANY_CODE>
    <ORG_CODE>COMPANY</ORG_CODE>
    <MESSAGE_TYPE>INBOUND_ENTITY_INTEGRATION</MESSAGE_TYPE>
    <USERID>COMPANY</USERID>
    <RECEIVER>TA15</RECEIVER>
    <SENDER>COMPANY</SENDER>
    <BATCH_ID>1234</BATCH_ID>
    <BUS_KEY>
      <ORG_CODE>COMPANY</ORG_CODE>
      <PO_NUMBER>1234</PO_NUMBER>
    </BUS_KEY>
  </INTEGRATION_MESSAGE_CONTROL>
  <PURCHASE_ORDER_HEADER>
    <CTRY_OF_EXPORT>TR</CTRY_OF_EXPORT>
    <CTRY_OF_IMPORT>US</CTRY_OF_IMPORT>
    <CURRENCY_CODE>USD</CURRENCY_CODE>
    <INCOTERM_CODE>011</INCOTERM_CODE>
    <ORG_CODE>COMPANY</ORG_CODE>
    <SOURCE_TX_ID>THING</SOURCE_TX_ID>
    <PO_NUMBER>1234</PO_NUMBER>
    <PURCHASE_ORDER_LINE>
        <BUSINESS_UNIT>BCA</BUSINESS_UNIT>
        <COMMERCIAL_UOM>EA</COMMERCIAL_UOM>
        <CTRY_OF_IMPORT>US</CTRY_OF_IMPORT>
        <CURRENCY_CODE>USD</CURRENCY_CODE>
        <DEPARTMENT>602</DEPARTMENT>
        <LINE_ID>1</LINE_ID>
    </PURCHASE_ORDER_LINE>
    <PURCHASE_ORDER_HEADER_PARTNER>
        <REF_RESOLUTION_PARTNER>Stuff</REF_RESOLUTION_PARTNER>
    </PURCHASE_ORDER_HEADER_PARTNER>
  </PURCHASE_ORDER_HEADER>
</CORE_PO_INBOUND_V2>

Есть какие-то настройки, которые я использую неправильно? Он настроен на работу со списками списков. Похоже, что эта проблема существует только для коллекций класса, созданного с помощью этого инструмента.

Изменить: добавление некоторых фрагментов класса конструктора, который генерируется xsd2code. Обратите внимание, что этот файл довольно большой (почти 10 000 строк...), поэтому я не собираюсь публиковать здесь все это, а скорее фрагменты, которые относятся к коллекциям элементов строки заказа на покупку:

public partial class CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADER : EntityBase<CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADER>
    {
private List<CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE> pURCHASE_ORDER_LINEField;

public List<CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE> PURCHASE_ORDER_LINE
        {
            get
            {
                if ((this.pURCHASE_ORDER_LINEField == null))
                {
                    this.pURCHASE_ORDER_LINEField = new List<CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE>();
                }
                return this.pURCHASE_ORDER_LINEField;
            }
            set
            {
                this.pURCHASE_ORDER_LINEField = value;
            }
        }
}
public partial class CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE : EntityBase<CORE_PO_INBOUND_V2PURCHASE_ORDER_HEADERPURCHASE_ORDER_LINE>
    {

        private System.Nullable<decimal> aREAField;

        private bool aREAFieldSpecified;

        private string aREA_UOMField;
...
}

1 ответ

Решение

Я думаю, что нашел решение. Я говорил с коллегой, который сделал что-то подобное. Он сказал, что использовал родной "xsd", а не "xsd2code". Мы сравнили то, что было сгенерировано, и заметили, что в массивах (в моем случае я использую списки...) у него была следующая аннотация:

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)]

Есть ли способ вызвать эту же аннотацию через xsd2code? Похоже, без этого дополнительные элементы генерируются при выполнении сериализатора.

Другие вопросы по тегам