.net &引用;类型不应为“;,使用DataContractSerializer-但它';这只是一门简单的课,没有有趣的东西?
我正在重构我的XML序列化,我想试试DataContractSerializer。 在需要序列化该类之前,一切都会顺利运行: 给我这个: 键入“VDB_Sync.Model.Konstant”,数据协定名称为“Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATACONTROTTRORIGLASTER的已知类型列表中。< /强> *到目前为止,我找到的帮助指向集合和类型。我的类中确实有一个enum(MySqlDbType)——但是得到了这个:当我根本没有声明DataMembers时,我甚至会得到相同的错误:-x 那么-这是怎么回事?我错过了什么 作为参考,以下是我序列化它的方式,VDB_SessionController是根:*.net &引用;类型不应为“;,使用DataContractSerializer-但它';这只是一门简单的课,没有有趣的东西?,.net,xml,serialization,xml-serialization,datacontractserializer,.net,Xml,Serialization,Xml Serialization,Datacontractserializer,我正在重构我的XML序列化,我想试试DataContractSerializer。 在需要序列化该类之前,一切都会顺利运行: 给我这个: 键入“VDB_Sync.Model.Konstant”,数据协定名称为“Konstant:http://schemas.datacontract.org/2004/07/VDB_Sync.Model”他说。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中——例如,使用NoNyType属性或将它们添加到传递给DATAC
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();
}
使用KnownTypeAttribute解析DataFelt类。 请参阅:更改此选项:
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
为此:
[DataContract(Name="Konstant")]
[KnownTypes(typeof(somenamespace.DataFelt))]
public class Konstant : DataFelt
正在报告的异常是VDB_Sync.Model.Konstant。这意味着在链的更上一层,这个类被拉入另一个类中,而那个类就是被序列化的那个类 问题在于,根据Konstant在此类中的嵌入方式(例如,如果它位于集合或泛型列表中),DataContractSerializer可能无法在反序列化过程中准备其外观 要解决此问题,需要将已知类型属性应用于包含Konstant的类。根据您的序列化代码,我怀疑这是
VDB\u SessionController
因此,请尝试使用KnownType属性装饰该类:
[KnownType(typeof(VDB_Sync.Model.Konstant)]
public class VDB_SessionController
您还可以将
[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;
}
}
[DataContract]
[KnownType(“GetKnownPersonTypes”)]
内部阶级人士
{
私有静态IEnumerable_personTypes;
私有静态IEnumerable GetKnownTypes()
{
if(_personTypes==null)
_personTypes=Assembly.getExecutionGassembly()
.GetTypes()
其中(t=>typeof(Person).IsAssignableFrom(t))
.ToList();
返回_personTypes;
}
}
现在,配置为与
Person
一起工作的DataContractSerializer
//XmlSerializer
也将与从Person
派生的任何类型一起工作(只要它在同一程序集中声明)。将其添加到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);
参考资料:就像@Leon建议的那样,但是通过@Bryan的修复,“KnownTypeAttribute”应该在基类上,所以应该是这样的:
[DataContract(Name="DataFelt")]
[KnownType(typeof(somenamespace.Konstant))]
public class DataFelt
在子类中:
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
我的问题是我从我的WebAPI控制器返回接口(个人)。当我将该返回类型更改为类(个人)类型时,这个错误消失了
不工作:
[HttpGet]
[Route("api/v1/Individual/Get/{id}")]
public IIndividual Get([FromUri]int id)
{
return _individualService.Get(id);
}
工作:
[HttpGet]
[Route("api/v1/Individual/Get/{id}")]
public Individual Get([FromUri]int id)
{
IIndividual individual = _individualService.Get(id);
return individual as Individual;
}
太棒了-它工作了!看来我需要上很多课,谢谢!如果类是由实体框架生成的,我将如何添加这个装饰呢?太好了!现在我也明白了“知识型”装饰的目的!谢谢你救了我一命。我希望我能投两次票,谢谢!。我的问题与IReadOnlyCollection不可序列化有关。改为使用IList使其正常工作。KnownTypeAttribute需要放在基类上。如果您没有访问基类的权限怎么办?所有这些都会禁用XML序列化,这就是异常消失的原因。但是,如果您需要XML序列化,这个答案将不会有帮助。另外,您只需要最后一行:config.Formatters.Remove(config.Formatters.XmlFormatter)代码>该行以上的所有内容都是无关的。
[HttpGet]
[Route("api/v1/Individual/Get/{id}")]
public Individual Get([FromUri]int id)
{
IIndividual individual = _individualService.Get(id);
return individual as Individual;
}