Исключение Datacontract. Не может быть сериализован
У меня есть следующий WCF DataContract:
[DataContract]
public class Occupant
{
private string _Name;
private string _Email;
private string _Organization;
private string _Badge;
public Occupant(string name, string badge, string organization)
{
Name = name;
Badge = badge;
Organization = organization;
}
public Occupant(string name, string badge)
{
Value = name;
Key = badge;
}
[DataMember]
public string Key
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string Value
{
get { return _Badge; }
set { _Badge = value; }
}
[DataMember]
public string Name
{
get { return _Name; }
set { _Name = value; }
}
[DataMember]
public string Email
{
get { return _Email; }
set { _Email = value; }
}
[DataMember]
public string Organization
{
get { return _Organization; }
set { _Organization = value; }
}
[DataMember]
public string Badge
{
get { return _Badge; }
set { _Badge = value; }
}
}
Когда я пытаюсь получить доступ к этой службе через веб-браузер (она размещена на IIS), я получаю эту ошибку:
System.Runtime.Serialization.InvalidDataContractException: тип 'MyNamespace.Occupant' не может быть сериализован. Подумайте о том, чтобы маркировать его атрибутом DataContractAttribute и маркировать все его элементы, которые вы хотите сериализовать с атрибутом DataMemberAttribute. Если тип представляет собой коллекцию, рассмотрите ее маркировку с помощью CollectionDataContractAttribute.
Один из моих методов возвращает List
типа Occupant
. Это будет причиной этого?
Ответы
Ответ 1
Поскольку вы предоставили один или несколько конструкторов инициализации, вам также потребуется добавить конструктор без параметров (по умолчанию).
то есть. Вам нужно добавить:
[DataContract]
public class Occupant
{
// *** Needed only for Serialization
public Occupant() {}
...
Это связано с тем, что конструктор по умолчанию исчезает при добавлении явного конструктора.
[Проблема не в том, что метод возвращает List<Occupant>
, так как методы не сериализованы).]
Ответ 2
Попробуйте добавить пустой конструктор. Часто это заставляет сериализатор.
Ответ 3
Вам нужен конструктор без параметров без параметров. Я никогда не планирую использовать мои, поэтому я добавил сводку для IntelliSense и выброшу исключение во время выполнения, чтобы оно не использовалось.
/// <summary>
/// parameterless default constructor only for serialization
/// </summary>
public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); }
Ответ 4
Вы должны добавить пустой конструктор параметров в класс datacontract
Ответ 5
Мое предположение было бы потому, что _Email
не инициализируется. Вы можете установить EmitDefaultValue
на false
и посмотреть, помогает ли это:
[DataMember(EmitDefaultValue = false)]
public string Email
{