Сериализация массива в C # - PullRequest
3 голосов
/ 20 марта 2009

У меня есть класс, который содержит несколько стандартных полей и массив.

Есть ли способ сериализации класса с использованием XmlSerializer?

Попытки пока приводят к сообщению об ошибке:

Unhandled Exception: System.InvalidOperationException: There was an error
generating the XML document. ---> System.InvalidOperationException: The type
XMLSerialization.DataPoints was not  expected. Use  the XmlInclude or
SoapInclude attribute  to specify types that are not known statically.

Некоторые урезанные представления классов показаны ниже:

public class StationData
{
  private DateTime _CollectionDate;
  private string _StationID;
  private ArrayList _PolledData;

  public StationData()
  {
  }
  public DateTime CollectionDate
  {
    get { return _CollectionDate; }
    set { _CollectionDate = value; }
  }
  public string StationID
  {
    get { return _StationID; }
    set { _StationID = value; }
  }
  [XmlInclude(typeof(DataPoints))]
  public ArrayList PolledData
  {
    get { return _PolledData; }
    set { _PolledData = value; }
  }
}

public class DataPoints
{
  private string _SubStationID;
  private int _PointValue;

  public DataPoints
  {
  }
  public string SubStationID
  {
    get { return _SubStationID; }
    set { _SubStationID = value; }
  }
  public int PointValue
  {
    get { return _PointValue; }
    set { _PointValue = value; }
  }
}

Ответы [ 5 ]

5 голосов
/ 20 марта 2009

У меня был успех со следующим:

[XmlArray("HasTypeSpecialisations")]
[XmlArrayItem("TypeObject", typeof(TypeObject), IsNullable = false)]
public List<TypeObject> TypeSpecialisations

В результате:

<HasTypeSpecialisations>
    <TypeObject />
    <TypeObject />
</HasTypeSpecialisations>

В вашей ситуации я бы попробовал что-то вроде:

[XmlArrayItem(typeof(DataPoints))]
public ArrayList PolledData

На основании этой ссылки http://msdn.microsoft.com/en-us/library/2baksw0z(VS.85).aspx вы также сможете использовать эту

[XmlElement(Type = typeof(DataPoints))]
public ArrayList PolledData
3 голосов
/ 20 марта 2009

XmlSerializer генерирует некоторый код во время выполнения для сериализации вашего класса. Для этого класса необходимо знать все типы, которые могут встречаться.

ArrayList не предоставляет эту информацию, но вы можете предоставить ее с помощью атрибута XmlInclude свойства, которое возвращает ArrayList.

[XmlInclude(typeof(DataPoints))]
public ArrayList Points {
   ...
}

Вы также можете использовать универсальный класс List <>.

1 голос
/ 20 марта 2009

Я думаю, что вы могли бы обойти это, используя универсальный список (List <>) вместо ArrayList, однако я собираюсь предположить, что вы не можете использовать универсальные по той или иной причине.

Вы должны сообщить компилятору, какой тип содержится в ArrayList, чтобы он мог его сериализовать, поскольку все, что он знает, что он содержит объекты.

Добавьте это над своей собственностью, и оно должно очиститься. [System.Xml.Serialization.XmlInclude (TypeOf (XMLSerialization.DataPoints))]

Конечно, замените XMLSerialization.DataPoints тем классом, который содержится в ArrayList.

0 голосов
/ 20 марта 2009

Метод, который я всегда использовал для сериализации списков, заключался в преобразовании их в массивы (которые содержат необходимую информацию о типе). Я признаю, что это немного грязно, но если вы не можете получить правильный список для сериализации, это будет работать.

0 голосов
/ 20 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...