3

我正在努力解决一个我还没有找到答案的反序列化问题。场景是这样的:

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; }
}
4

1 回答 1

0

我放弃了在反序列化时尝试用未知类型解决这个问题,而是重新设计了应用程序。对于序列化/反序列化机制来说,自己设计的实体和集合的层次似乎太多了。

现在我通过一个单独的 WCF 服务在集合中获取我的 X 类型实体,它就像一个魅力。

无论如何感谢您的努力!

于 2012-01-05T09:48:41.387 回答