数据协定异常.无法序列化
本文关键字:序列化 异常 数据 | 更新日期: 2023-09-27 18:30:36
>我有以下WCF数据协定:
[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; }
}
}
当我尝试通过 Web 浏览器访问此服务(它托管在 IIS 上)时,出现此错误:
System.Runtime.Serialization.InvalidDataContractException:类型"MyNamespace.Occupant"无法序列化。请考虑使用 DataContractAttribute 属性标记它,并使用 DataMemberAttribute 属性标记要序列化的所有成员。 如果类型是集合,请考虑使用 CollectionDataContractAttribute 标记它。
我的一种方法是返回 Occupant
类型的List
。这会导致它吗?
由于提供了一个或多个初始化构造函数,因此还需要添加无参数(默认)构造函数。
即您需要添加:
[DataContract]
public class Occupant
{
// *** Needed only for Serialization
public Occupant() {}
...
这是因为添加显式构造函数时默认构造函数将消失。
[问题不在于返回List<Occupant>
的方法,因为方法没有序列化)。
尝试添加一个空的构造函数。 通常,这会引发序列化程序。
你需要一个默认的无参数构造函数。我从不打算实际使用我的,所以我为 IntelliSense 添加了一个摘要,并抛出了一个运行时异常来防止它被使用。
/// <summary>
/// parameterless default constructor only for serialization
/// </summary>
public MyClass() { throw new NotImplementedException("parameterless default constructor only for serialization"); }
你应该向数据合约类添加一个空参数构造函数
如果默认情况下没有 setter,请执行以下步骤:
- 添加无参数构造函数;
- 并至少添加私有集。
这对我有帮助。
我的猜测是因为_Email
没有初始化。 您可以将EmitDefaultValue
设置为 false
,看看是否有帮助:
[DataMember(EmitDefaultValue = false)]
public string Email
{