Nano Hash - криптовалюты, майнинг, программирование

Добавить атрибут XML в сериализованное свойство класса

Я видел пример, в котором для этого используется класс-оболочка, но мне было интересно, есть ли лучший (более простой) способ.

Мои классы следующие:

public class PartData
{
  public List<PartInfo> PartList { get; set; }
}


public class PartInfo
{
  public string PartNumber { get; set; }

  public string OEMNumbers { get; set; }

  public List<VehicleApplication> VehicleApplications { get; set; }
}


public class VehicleApplication
{

  public string Year { get; set; }

  public string Make { get; set; }

  public string Model { get; set; }
}

Сериализировать код:

//serialize
private void serialize()
{
   PartData p = GetParts();
   SerializeClass(p);
}

public void SerializeClass(object instance)
{
  var serializer = new XmlSerializer(typeof(PartData));

  using (var writer = new StreamWriter("C:\\TestFile.xml"))
  {
    serializer.Serialize(writer, instance);
  }
}

при сериализации я получаю следующий вывод:

 <PartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PartList>
    <PartInfo>
      <PartNumber>12345</PartNumber>
      <OEMNumbers>14556, 14557, 14558, 14559</OEMNumbers>
      <VehicleApplications>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
      </VehicleApplications>
    </PartInfo>
  </PartList>
</PartData>

В идеале я хотел бы сделать PartNumber таким атрибутом:

 <PartData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PartList>
    <PartInfo>
      <PartNumber Id ="12345">
      <OEMNumbers>14556, 14557, 14558, 14559</OEMNumbers>
      <VehicleApplications>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
        <VehicleApplication>
          <Year>2001</Year>
          <Make>Ford</Make>
          <Model>F150</Model>
        </VehicleApplication>
      </VehicleApplications>
    </Partnumber>
    </PartInfo>
  </PartList>
</PartData>

Я пробовал добавить:

public class PartInfo
{
  [XmlAttribute("Id")]
  public string PartNumber { get; set; }

  public string OEMNumbers { get; set; }

  public List<VehicleApplication> VehicleApplications { get; set; }
}

но создает:

<PartInfo Id="12345">

когда мне нужно:

<PartNumber Id="12345">
10.04.2013

  • Вы, вероятно, имеете в виду <PartInfo PartNumber='12345'> (например, не иметь PartNumber в качестве «оболочки» содержимого PartInfo). Если это действительно так, просто добавьте свойство [XmlAttribute] к свойству PartNumber. 10.04.2013
  • как вы сейчас сериализуете? похоже, вы могли бы попробовать [XmlAttribute] (также, пожалуйста, сократите свой пример, мне потребовалось время, чтобы понять, в чем отличие!) 10.04.2013
  • извините за грубое объяснение... то, что вы оба предложили, дает: ‹PartInfo Id=12345›, когда я хотел бы ‹PartNumber Id=12345› 10.04.2013
  • Я думаю, что вам, возможно, придется сделать, это создать класс номера детали, который имеет строку (т.е. другую оболочку); отредактируйте, чтобы вы не писали дополнительные строки при использовании номера детали в коде, просто укажите текущий номер детали, получите и установите строковое значение классов-оболочек 10.04.2013
  • что я очень не хотел делать... 10.04.2013
  • Вы хотите, чтобы <OEMNumbers> и <VehicleApplications> были детьми <PartNumber>? 10.04.2013
  • @pfyod Да, именно то, что я хочу 10.04.2013
  • все данные должны быть дочерними элементами PartNumber 10.04.2013
  • Тогда я предполагаю, что вам действительно нужно сделать PartNumber классом и иметь внутри него свойство Id (сопоставленное с атрибутом с [XmlAttribute]) внутри него - я не знаю ни одного атрибута XmlSerializer, который выполнял бы преобразование, которое вам нужно. 10.04.2013
  • без написания собственного сериализатора, то единственным способом было бы создать подкласс деталей с номером детали как [XmlAttribute 10.04.2013
  • @pfyod - всегда на 20 секунд впереди меня... :D 10.04.2013
  • @pfyod, не могли бы вы уточнить, как бы вы изменили структуру моих вышеуказанных классов? 10.04.2013
  • каждый номер детали будет иметь список oemNumbers и VehicleApplications 10.04.2013

Ответы:


1

Я думаю, что это единственный способ достичь того, чего вы пытаетесь достичь.

public class PartDetail
{
  [XmlAttribute]
  public string ID{ get; set; }

  public string OEMNumbers { get; set; }

  public List<VehicleApplication> VehicleApplications { get; set; }
}

public class PartInfo
{
  public PartDetail { get; set; }
}

В ответ на ваш первый комментарий это самый простой способ добиться этого, альтернативой является написание собственного сериализатора.

10.04.2013
  • Первоначально у меня было это в моем первом дизайне, похоже, это может быть единственный ответ без переопределения класса сериализатора. 10.04.2013
  • Это единственный способ сделать это для моей ситуации, если вы беспокоитесь о том, чтобы внести много изменений в свой код, чтобы это работало, вы можете использовать тег [XmlIgnore], чтобы предоставить средства доступа к свойствам в PartInfo для этих методов в Деталь детали 10.04.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..