.net &引用;类型不应为“;,使用DataContractSerializer-但它';这只是一门简单的课,没有有趣的东西?

.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

我正在重构我的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是根:*

    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;
    }