XmlSerializer - произошла ошибка, отражающая тип - PullRequest
323 голосов
/ 13 сентября 2008

Используя C # .NET 2.0, у меня есть составной класс данных, в котором есть атрибут [Serializable]. Я создаю класс XMLSerializer и передаю его в конструктор:

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));

Я получаю исключение, говорящее:

Произошла ошибка при отображении типа.

Внутри класса данных есть еще один составной объект. Должен ли он иметь атрибут [Serializable] или, если он находится на верхнем объекте, рекурсивно ли он применяется ко всем объектам внутри?

Ответы [ 16 ]

2 голосов
/ 13 сентября 2008

Я тоже думал, что атрибут Serializable должен быть на объекте, но если я не являюсь полным нубом (я нахожусь в середине ночной сессии кодирования), то следующий код работает из SnippetCompiler :

using System;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.Xml.Serialization;

public class Inner
{
    private string _AnotherStringProperty;
    public string AnotherStringProperty 
    { 
      get { return _AnotherStringProperty; } 
      set { _AnotherStringProperty = value; } 
    }
}

public class DataClass
{
    private string _StringProperty;
    public string StringProperty 
    { 
       get { return _StringProperty; } 
       set{ _StringProperty = value; } 
    }

    private Inner _InnerObject;
    public Inner InnerObject 
    { 
       get { return _InnerObject; } 
       set { _InnerObject = value; } 
    }
}

public class MyClass
{

    public static void Main()
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
            TextWriter writer = new StreamWriter(@"c:\tmp\dataClass.xml");
            DataClass clazz = new DataClass();
            Inner inner = new Inner();
            inner.AnotherStringProperty = "Foo2";
            clazz.InnerObject = inner;
            clazz.StringProperty = "foo";
            serializer.Serialize(writer, clazz);
        }
        finally
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }

}

Я полагаю, что XmlSerializer использует отражение над общими свойствами.

1 голос
/ 18 декабря 2012

У меня была ситуация, когда Орден был одинаковым для двух элементов подряд

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "SeriousInjuryFlag")]

.... некоторый код ...

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "AccidentFlag")]

Когда я изменил код, увеличивая порядок на единицу для каждого нового свойства в классе, ошибка исчезла.

0 голосов
/ 26 мая 2017

У меня была та же проблема, и в моем случае объект имел ReadOnlyCollection. Коллекция должна реализовывать метод Add для сериализации.

0 голосов
/ 16 февраля 2017

[System.Xml.Serialization.XmlElementAttribute ("strFieldName", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] * ​​1001 *

// Или

[XmlIgnore] string [] strFielsName {get; set;}

0 голосов
/ 16 сентября 2008

Я использовал класс NetDataSerialiser для сериализации мои доменные классы. NetDataContractSerializer Class .

Классы домена распределяются между клиентом и сервером.

0 голосов
/ 13 сентября 2008

Также обратите внимание, что вы не можете сериализовать элементы управления пользовательского интерфейса и что любой объект, который вы хотите передать в буфер обмена, должен быть сериализуемым, иначе он не может быть передан другим процессам.

...