说我有以下类:DataContractJsonSerializer抛出SerializationException,抱怨意想不到的类型,即使我已经与KnownTypeAttribute
[DataContract]
class Entry<T>
{
[DataMember]
public T Data { get; set; }
}
[DataContract]
class DataList<T>
{
[DataMember]
public IList<T> Collection { get; set; }
}
[DataContract]
[KnownType(typeof(User))]
class ExtendedDataList : DataList<object>
{
[DataMember]
public string SomeExtraParameter { get; set; }
}
[DataContract]
class User
{
[DataMember]
public string Name { get; set; }
}
我申请KnownTypeAttribute
到ExtendedDataList
因为那类扩展的基类的一般键入object
,它将在列表中存储不同种类的对象。在这个例子中,我已经标记了一个已知类型User
,因为我知道它将包含User
对象。
这里的序列化代码:
var user = new User { Name = "Bob" };
var users = new ExtendedDataList { Collection = new List<object> { user } };
serialize(users);
与
static void serialize<T>(T obj)
{
var entry = new Entry<T>();
entry.Data = obj;
var stream = new MemoryStream();
var serializer = new DataContractJsonSerializer(typeof(Entry<T>));
serializer.WriteObject(stream, entry);
stream.Seek(0, SeekOrigin.Begin);
var r = new StreamReader(stream);
var s = r.ReadToEnd();
System.Diagnostics.Debug.WriteLine(s);
}
行serializer.WriteObject(stream, entry);
抛出一个SerializationException
说,类型User
是没有预料,我应该用KnownTypeAttribute
指定它。但我做了(间接)!
我该如何做这项工作?我不能将KnownType
移动到Entry<T>
类,因为它需要是一般的。为什么DataContractJsonSerializer
看不到ExtendedDataList
指定User
作为已知类型?