Jul*_*ian 58 .net xml serialization xml-serialization datacontractserializer
我正在重构我的XML序列化,并认为我会尝试使用DataContractSerializer.一切都运行顺利,直到它需要序列化这个类:
using System;
using System.Runtime.Serialization;
namespace VDB_Sync.Model
{
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
{
[DataMember]
private MySqlDbType mydataType;
[DataMember]
private object value;
public Konstant(string navn, MySqlDbType dataType, object value)
: base(navn, dataType, "*Konstant", false, false)
{
//this.navn = navn;
this.mydataType = dataType;
this.value = value;
if (navn.Contains("*Løbenummer"))
{
navn = "*Konstant: " + Convert.ToString(value);
}
}
public object Value
{
get
{
return value;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
它给了我这个:
键入"VDB_Sync.Model.Konstant",数据合同名称为"Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model",不是预期的.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.
*到目前为止我找到的帮助指向了集合和类型.我的类中有一个枚举(MySqlDbType) - 但是得到这个:当我没有声明DataMembers时,我甚至得到了同样的错误:-x那么 - 这里发生了什么?我错过了什么?
作为参考,这是我如何序列化它,VDB_SessionController是根:*
public void GemKonfig(VDB_SessionController session)
{
var settings = new XmlWriterSettings()
{
Indent = true,
IndentChars = "\t"
};
var writer = XmlWriter.Create(defaultFile, settings);
DataContractSerializer ser =
new DataContractSerializer(typeof(VDB_SessionController));
ser.WriteObject(writer, session);
writer.Close();
}
Run Code Online (Sandbox Code Playgroud)
com*_*ech 66
报告的异常是针对VDB_Sync.Model.Konstant.这意味着在链的某个地方,这个类被拉入另一个类,该类是被序列化的类.
问题在于,根据Konstant在此类中的嵌入方式(例如,如果它位于集合或通用列表中),DataContractSerializer可能无法在反序列化期间为其外观做好准备.
要解决此问题,您需要将known-type属性应用于包含Konstant的类.根据您的序列化代码,我怀疑这是VDB_SessionController.
因此,尝试使用KnownType属性来装饰此类:
[KnownType(typeof(VDB_Sync.Model.Konstant)]
public class VDB_SessionController
Run Code Online (Sandbox Code Playgroud)
fen*_*222 16
将其添加到WebApiConfig.cs
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)
参考:http://www.datazx.cn/Forums/en-US/a5adf07b-e622-4a12-872d-40c753417645/action? threadDisplayName= web-api-error-the-objectcontent1-type-failed-to-serialize-该反应体换内容&论坛= WCF
dca*_*tro 13
您还可以组合[KnownType]和反射,使您的代码更能抵抗未来的变化.
[DataContract]
[KnownType("GetKnownPersonTypes")]
internal class Person
{
private static IEnumerable<Type> _personTypes;
private static IEnumerable<Type> GetKnownTypes()
{
if (_personTypes == null)
_personTypes = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof (Person).IsAssignableFrom(t))
.ToList();
return _personTypes;
}
}
Run Code Online (Sandbox Code Playgroud)
现在DataContractSerializer/ DataContractJsonSerializer/ XmlSerializer配置为使用Person,也可以使用派生自的任何类型Person(只要它在同一个程序集中声明).
| 归档时间: |
|
| 查看次数: |
60384 次 |
| 最近记录: |