无法序列化C#类 - 获取Unknown Type错误并建议使用KnownType属性

时间:2014-12-12 14:56:05

标签: c# serialization

我定义了以下类

[DataContract(Name="PatientDocument")]
[KnownType(typeof(PatientDocument))]
public class PatientDocument 
{
    public PatientDocument()
    {
        //
        // TODO: Add constructor logic here
        //
    }
[DataMember]
public virtual String r_object_id { get; set; }

[DataMember]
public virtual int i_partition { get; set; }

[DataMember]
public virtual String nhs_consultant { get; set; }

。 。 。

[DataMember]
public virtual String batch_name { get; set; }

[DataMember]
public virtual String document_type_code { get; set; }

[DataMember]
public virtual String nhs_patdoc_singlebodysite { get; set; }

}

,这用于以下功能

PatientDocuments pds            = null;
PatientDocument[] results       = null;
String PatientId                  = String.Empty;
StreamReader sr         = null;
DataContractJsonSerializer serializer = null;

try
{
    using ( MemoryStream ms = new MemoryStream())
    {
               pds = new PatientDocuments(Properties.Settings.Default.DataConnection);
               serializer  = new DataContractJsonSerializer(typeof(PatientDocument));

        PatientId   = context.Request.QueryString["PatientId"];
        results     = pds.Select(PatientId);

        serializer.WriteObject(ms,results);
        ms.Position = 0;
        sr = new StreamReader(ms);

        // now write to the context/browser

        context.Response.ContentType = "text/plain";
        context.Response.Write(sr.ReadToEnd());
    }

}
catch(System.Exception ex)
{
    throw;
}

该行

serializer.WriteObject(ms,results);

失败并显示消息

不希望输入数据合约名称为“ArrayOfPatientDocument:http://schemas.datacontract.org/2004/07/”的'PatientDocument []'。将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我看不到如何使用KnownAttribute来允许我序列化类。

使用.Net 3.5

1 个答案:

答案 0 :(得分:2)

您正在尝试使用为 PatiantDocument创建的序列化程序序列化PatientDocument个对象的数组。将序列化程序初始化更改为:

serializer = new DataContractJsonSerializer(typeof(PatientDocument[]));

您不需要KnownType属性,因为您没有非基本类型的任何属性(除非剪切代码中有一些属性)。