次の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; }
}
}
Webブラウザ(IISでホストされている)を介してこのサービスにアクセスしようとすると、次のエラーが表示されます。
System.Runtime.Serialization.InvalidDataContractException:タイプ 'MyNamespace.Occupant'をシリアル化できません。 DataContractAttribute属性でマークし、シリアル化するすべてのメンバーをDataMemberAttribute属性でマークすることを検討してください。タイプがコレクションの場合、CollectionDataContractAttributeでマークすることを検討してください。
私のメソッドの1つは、List
型のOccupant
を返すことです。これが原因ですか?
1つ以上の初期化コンストラクターを提供したため、パラメーターなし(デフォルト)コンストラクターも追加する必要があります。
つまり、次を追加する必要があります。
[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"); }
空のパラメーターコンストラクターをdatacontractクラスに追加する必要があります
デフォルトでセッターがない場合は、次の手順を実行します。
これは私を助けます。
私の推測は_Email
は初期化されていません。 EmitDefaultValue
をfalse
に設定し、それが役立つかどうかを確認できます。
[DataMember(EmitDefaultValue = false)]
public string Email
{