【问题标题】:Why am I getting the exception "Consider using a DataContractResolver or add any types not known statically to the list of known types"为什么我会收到异常“考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中”
【发布时间】:2014-11-04 19:34:55
【问题描述】:

我正在尝试使用 DataContractSerializer 将对象序列化为 Xml。我有以下课程;

[ActiveRecord(Lazy = true)]
[KnownType(typeof(RoomType))]
[DataContract]
public class Room : ActiveRecordBase<Room>
{
    [PrimaryKey]
    [DataMember]
    public virtual Int64 RoomId { get; protected set; }

    [BelongsTo("RoomTypeId")]
    [DataMember]
    public virtual RoomType RoomType { get; set; }

    [Property]
    [DataMember]
    public virtual Int64 HotelId { get; set; }

    [Property]
    [DataMember]
    public virtual string Name { get; set; }

    [Property]
    [DataMember]
    public virtual string Description { get; set; }

    public static Room[] FindByHotelId(Int64 HotelId)
    {
        return (Room[])FindAllByProperty(typeof(Room), "HotelId", HotelId);
    }
}

RoomType 类是

[ActiveRecord(Lazy = true)]
[DataContract]
public class RoomType : ActiveRecordBase<RoomType>
{
    [PrimaryKey]
    [DataMember]
    public virtual int RoomTypeId { get; protected set; }

    [Property]
    [DataMember]
    public virtual string Name { get; set; }

}

我使用下面的方法来序列化对象

    internal static XElement ObjectToXElement<T>(T source)
    {
        XDocument oXDocument = new XDocument();

        try
        {
            using (var writer = oXDocument.CreateWriter())
            {
                // write xml into the writer
                var serializer = new DataContractSerializer(source.GetType());
                serializer.WriteObject(writer, source);
            }
        }
        catch(Exception e)
        {
            using (var writer = oXDocument.CreateWriter())
            {
                // write xml into the writer
                var serializer = new DataContractSerializer(oError.GetType());
                serializer.WriteObject(writer, oError);
            }
        }

        return oXDocument.Root;
    }

我要序列化的实际对象是;

[KnownType(typeof(List<Room>))]
[KnownType(typeof(RoomType))]
[DataContract]
public class RoomTypeResponse
{
    [DataMember]
    public int Code { get; set; }

    [DataMember]
    public string Message { get; set; }

    [DataMember]
    public List<Room> Rooms { get; set; }

    public RoomTypeResponse()
    {
        this.Rooms = new List<Room>();
    }
}

但由于某种原因,当我调用序列化对象的方法时,我得到以下异常;

使用数据合约名称键入“Castle.Proxies.RoomTypeProxy” '房间类型代理:http://schemas.datacontract.org/2004/07/Castle.Proxies' 预计不会。考虑使用 DataContractResolver 或添加任何 已知类型列表中静态未知的类型 - 例如, 通过使用 KnownTypeAttribute 属性或将它们添加到 传递给 DataContractSerializer 的已知类型列表。

如果我在 Room 类中注释掉该属性,它可以正常工作

[BelongsTo("RoomTypeId")]
[DataMember]
public virtual RoomType RoomType { get; set; }

我不确定为什么会出现异常,因为我已经为 RoomType 添加了 knowtype 属性?我错过了什么,导致了这个问题。

【问题讨论】:

  • 您对此没有解决方案?

标签: c# wcf nhibernate datacontractserializer castle-activerecord


【解决方案1】:

问题是在运行时生成了一种类型 (Castle.Proxies.RoomTypeProxy),因此 .NET 对此一无所知。这不是 NHibernate 特有的问题。如果您禁用延迟加载和代理生成,问题就会消失,但我知道这可能会很困难。 其他选择是使用另一个序列化程序,例如 BinaryFormatter,但我不知道这是否适合您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多