Сериализация Silverlight веб-службы .NET вызывает ошибку XML - PullRequest
0 голосов
/ 04 мая 2009

У меня есть этот класс, предоставляемый веб-сервисом, который затем используется приложением Silverlight (я не знаю, актуально это или нет)

[Serializable]
public class Entry
{
    private string _title;

    public string Id { get; set; }
    public string Title { get { return _title; } set { _title = value; } }
    public string Link { get; set; }
    public DateTime Published { get; set; }
    public DateTime Updated { get; set; }
    public User User { get; set; }
    public Service Service { get; set; }
    public List<Comment> Comments { get; set; }
    public List<Like> Likes { get; set; }
    public List<Media> Media { get; set; }
}

Переменная _title, которую я добавил, чтобы продемонстрировать, что происходит не так. Когда я ссылаюсь на веб-сервис в своем приложении silverlight, он генерирует следующее xsd:

  <xs:complexType name="Entry">
    <xs:sequence>
      <xs:element name="_title" nillable="true" type="xs:string" />
      <xs:element name="_x003C_Comments_x003E_k__BackingField" nillable="true" type="tns:ArrayOfComment" />
      <xs:element name="_x003C_Id_x003E_k__BackingField" nillable="true" type="xs:string" />
      <xs:element name="_x003C_Likes_x003E_k__BackingField" nillable="true" type="tns:ArrayOfLike" />
      <xs:element name="_x003C_Link_x003E_k__BackingField" nillable="true" type="xs:string" />
      <xs:element name="_x003C_Media_x003E_k__BackingField" nillable="true" type="tns:ArrayOfMedia" />
      <xs:element name="_x003C_Published_x003E_k__BackingField" type="xs:dateTime" />
      <xs:element name="_x003C_Service_x003E_k__BackingField" nillable="true" type="tns:Service" />
      <xs:element name="_x003C_Updated_x003E_k__BackingField" type="xs:dateTime" />
      <xs:element name="_x003C_User_x003E_k__BackingField" nillable="true" type="tns:User" />
    </xs:sequence>
  </xs:complexType>

Обратите внимание, что только свойство title имеет просто имя, остальные имеют имя <Link>_BackingField, которое полностью умирает при попытке загрузить элемент, потому что в имени свойства не может быть <или>.

Почему происходит сериализация вспомогательных полей, а не открытых свойств?

Ответы [ 2 ]

3 голосов
/ 04 мая 2009

Как объяснено в этой статье , когда вы используете DataContractSerializer (сериализатор по умолчанию для WCF) в сочетании с атрибутом Serializable, поведение таково, что все поля, общие и частные, сериализованная. Поскольку в вашем случае резервные поля генерируются автоматически, компилятор предлагает забавные имена, которые не имеют шансов конфликтовать с любыми именами полей, которые вы можете создать (C # может не принимать «<» или «>» в ​​идентификаторах, но CLR не так придирчиво).

Вероятно, самый простой способ исправить эту ситуацию - добавить атрибуты DataContract и DataMember в класс Entry в зависимости от ситуации.

1 голос
/ 04 мая 2009

Не используйте автоматические свойства. Вместо записи:

public string Id { get; set; }

запись:

string id;
public string Id { get { return id;} set {id = value;} }

В случае автоматических свойств сериализуется только поле поддержки, поэтому вы получаете странные имена.

...