我正在努力解决一个我还没有找到答案的反序列化问题。场景是这样的:
Silverlight 客户端登录到服务器并取回会话对象。会话对象包含各种信息,其中包括一个称为 UserSettings 的集合。该集合包含一个名为 propertyentity 的类型,它基本上有两个属性,一个字符串和一个对象。反序列化时出现以下错误:
System.Runtime.Serialization.SerializationException:JSON 包含指定数据合同名称“http://www.xyz.se/rc:ClientDifferenceRules”的“__type”成员。反序列化器不知道映射到该合约的任何类型。将与“ClientDifferenceRules”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。您通常还可以通过避免使用生成 JSON 的派生类型来消除此错误。
在 session.UserSettings 中发送其他属性时,例如包含普通 int 作为反序列化的效果很好。如何告诉反序列化器它是什么数据类型?
ClientDifferenceRules 如下所示:
using System;
using System.Diagnostics;
using System.Text;
using System.ComponentModel;
using System.Runtime.Serialization;
namespace XYZ.BusinessEntities.Settings
{
[Serializable]
[DataContract(Name = "ClientDifferenceRules", Namespace = Constants.Namespace)]
[KnownType(typeof(ClientDifferenceRules))]
public class ClientDifferenceRules : RCBusinessBase
{
//private fields omitted for better readability
public ClientDifferenceRules() : base()
{
}
[DataMember]
public override int Id
{
get { return _levelId;}
set { }
}
[DataMember]
public int clientId
{
get { return _clientId;}
set { _clientId = value;}
}
[DataMember]
public int typeId
{
get { return _typeId; }
set { _typeId = value; }
}
[DataMember]
public short levelId
{
get { return _levelId; }
set { _levelId = value; }
}
[DataMember]
public double? limitFrom
{
get { return _limitFrom; }
set { _limitFrom = value; }
}
[DataMember]
public double? limitTo
{
get { return _limitTo; }
set { _limitTo = value; }
}
[DataMember]
public string message
{
get { return _message; }
set { _message = value; }
}
[DataMember]
public string description
{
get { return _description; }
set { _description = value; }
}
[DataMember]
public string backColor
{
get { return _backColor; }
set { _backColor = value; }
}
[DataMember]
public string foreColor
{
get { return _foreColor; }
set { _foreColor = value; }
}
[DataMember]
public string imageUri
{
get { return _imageUri; }
set { _imageUri = value; }
}
[DataMember]
public DifferenceType differenceType
{
get
{
DifferenceType enmType = (DifferenceType)this.typeId;
return enmType;
}
set { this.typeId = (int)value; }
}
[DataMember]
public DifferenceLevel differenceLevel
{
get
{
DifferenceLevel enmLevel = (DifferenceLevel)this.levelId;
return enmLevel;
}
set { this.levelId = (short)value; }
}
}
}
ClientDifferenceRulesCollection 看起来像这样:
using System;
using System.Text;
using System.Collections.Generic;
using Momentum.Common.Framework;
using System.Runtime.Serialization;
namespace XYZ.RC.BusinessEntities.Settings
{
[Serializable]
[CollectionDataContract(Name = "ClientDifferenceRulesCollection", Namespace = Constants.Namespace)]
[TypedCollection(typeof(ClientDifferenceRules))]
[KnownType(typeof(ClientDifferenceRulesCollection))]
public class ClientDifferenceRulesCollection : BusinessCollectionBase<ClientDifferenceRules>
{
public ClientDifferenceRulesCollection() : base(){}
public ClientDifferenceRulesCollection(UserSession Session) : base(Session){}
public ClientDifferenceRulesCollection(IList<ClientDifferenceRules> initialList) : base(initialList) { }
}
}
PropertyEntity 看起来像这样(来自元数据):
[DataContract(Name = "PropertyEntity", Namespace = "http://www.momentum.se//common")]
public class PropertyEntity
{
public PropertyEntity();
public PropertyEntity(string name, object value);
[DataMember]
public string Name { get; set; }
[DataMember]
public object Tag { get; set; }
public TypeCode typeCode { get; set; }
[DataMember]
public TypeOfProperty TypeOfProperty { get; set; }
[DataMember]
public object Value { get; set; }
}