我正在尝试序列化.net对象包含另一个数据协定对象作为参数。代码如下......
[DataContract]
public class JsonObject2
{
[DataMember(Name = "field1")]
string field1 { get; set; }
[DataMember(Name = "field2")]
string field2 { get; set; }
[DataMember(Name = "field3")]
object[][] test = { new object[]{"key1", "value1"}, new object[]{"key2", "value2"}, new object[]{"key3", "value3"} };
}
[DataContract]
public class JsonObject3
{
[DataMember(Name = "field1")]
public string field1 { get; set; }
[DataMember(Name = "field2")]
public object field2 { get; set; }
}
DataContractJsonSerializer dcjs2 = new DataContractJsonSerializer(typeof(JsonObject3));
JsonObject3 obj3 = new JsonObject3();
obj3.field1 = "hello";
obj3.field2 = new JsonObject2();
dcjs2.WriteObject(s, obj3);
s.Position = 0;
MessageBox.Show(new StreamReader(s).ReadToEnd());
执行上述操作会导致以下异常......
“{”类型'JSONParser.Form1 + JsonObject2',数据协定名称为“Form1.JsonObject2:http://schemas.datacontract.org/2004/07/JSONParser”,不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。“}”
我无法弄清楚如何执行该例外中给出的任何建议。
答案 0 :(得分:0)
好的,想出怎么做。我不想删除这个问题以防其他人觉得它有用,所以这里有解决方案...
[DataContract]
[KnownType(typeof(JsonObject2))]
public class JsonObject2
{
[DataMember(Name = "field1")]
string field1 { get; set; }
[DataMember(Name = "field2")]
string field2 { get; set; }
[DataMember(Name = "field3")]
object[][] test = { new object[]{"key1", "value1"}, new object[]{"key2", "value2"}, new object[]{"key3", "value3"} };
}
[DataContract]
public class JsonObject3
{
[DataMember(Name = "field1")]
public string field1 { get; set; }
[DataMember(Name = "field2")]
public object field2 { get; set; }
}
注意JsonObject2类声明之上的[KnownType(typeof(JsonObject2))]
?这解决了它。