XmlSerializer - wystąpił błąd

Używając C#. Net 2.0, mam złożoną klasę danych, która ma atrybut [Serializable]. Tworzę klasę XMLSerializer i przekazuję ją do konstruktora:

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

Dostaję wyjątek mówiący:

Wystąpił błąd odbijający Typ.

Wewnątrz klasy danych znajduje się inny obiekt złożony. Czy to również musi mieć atrybut [Serializable], czy mając go na górnym obiekcie, czy rekurencyjnie stosuje go do wszystkich obiektów wewnątrz?

Author: Ryan Kohn, 2008-09-13

16 answers

Spójrz na wewnętrzny wyjątek, który dostajesz. Powie Ci, które pole / właściwość ma problemy z serializacją.

Możesz wykluczyć pola / właściwości z serializacji xml, dekorując je atrybutem [XmlIgnore].

Myślę, że XmlSerializer nie używa atrybutu [Serializable], więc wątpię, że to jest problem.

 389
Author: Lamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 08:06:59

Pamiętaj, że klasy serializowane muszą mieć domyślne (tzn. bez parametru) konstruktory. Jeśli w ogóle nie masz konstruktora, to w porządku; ale jeśli masz konstruktor z parametrem, musisz również dodać domyślny.

 107
Author: Jeremy McGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-13 16:23:20

Miałem podobny problem i okazało się, że serializer nie potrafi rozróżnić dwóch klas, które miałem o tej samej nazwie (jedna była podklasą drugiej). Wewnętrzny wyjątek wyglądał tak:

' Types BaseNamespace.Class1 " i " BaseNamespace.Podnamespace.Class1 'oba używają nazwy typu XML, 'Class1', z przestrzeni nazw". Użyj atrybutów XML, aby określić unikalną nazwę XML i / lub Przestrzeń nazw dla typu.

Gdzie BaseNamespace.Podnamespace.Klasa 1 jest podklasą BaseNamespace.Klasa1.

To co musiałem zrobić to dodać atrybut do jednej z klas (dodałem do klasy bazowej):

[XmlType("BaseNamespace.Class1")]

Uwaga: Jeśli masz więcej warstw klas, musisz dodać do nich atrybut.

 21
Author: Dennis Calla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-16 21:51:10

Należy również pamiętać, że XmlSerializer nie można serializować abstrakcyjnych właściwości.. Zobacz moje pytanie tutaj (do którego dodałem kod rozwiązania)..

Serializacja XML i typy dziedziczone

 7
Author: Rob Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:51

Najczęstsze przeze mnie powody:

 - the object being serialized has no parameterless constructor
 - the object contains Dictionary
 - the object has some public Interface members
 6
Author: Stefan Michev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-22 12:43:26

Wszystkie obiekty na wykresie serializacji muszą być serializowalne.

Ponieważ XMLSerializer jest czarną skrzynką, sprawdź te linki, jeśli chcesz debugować dalej w procesie serializacji..

Zmiana miejsca, w którym XmlSerializer wysyła tymczasowe zespoły

Jak: debugować do. NET XmlSerializer wygenerowany Assembly

 5
Author: Gulzar Nazim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 14:34:06

Jeśli potrzebujesz obsługiwać określone atrybuty (np. słownik, lub dowolną klasę), możesz zaimplementować interfejs IXmlSerialiable, który pozwoli Ci na większą swobodę kosztem bardziej szczegółowego kodowania .

public class NetService : IXmlSerializable
{
    #region Data

        public string Identifier = String.Empty;

        public string Name = String.Empty;

        public IPAddress Address = IPAddress.None;
        public int Port = 7777;

    #endregion

    #region IXmlSerializable Implementation

        public XmlSchema GetSchema() { return (null); }

        public void ReadXml(XmlReader reader)
        {
            // Attributes
            Identifier = reader[XML_IDENTIFIER];
            if (Int32.TryParse(reader[XML_NETWORK_PORT], out Port) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_PORT);
            if (IPAddress.TryParse(reader[XML_NETWORK_ADDR], out Address) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_ADDR);
        }

        public void WriteXml(XmlWriter writer)
        {
            // Attributes
            writer.WriteAttributeString(XML_IDENTIFIER, Identifier);
            writer.WriteAttributeString(XML_NETWORK_ADDR, Address.ToString());
            writer.WriteAttributeString(XML_NETWORK_PORT, Port.ToString());
        }

        private const string XML_IDENTIFIER = "Id";

        private const string XML_NETWORK_ADDR = "Address";

        private const string XML_NETWORK_PORT = "Port";

    #endregion
}

Jest ciekawy Artykuł , który pokazuje elegancki sposób implementowania wyrafinowanego sposobu "rozszerzenia" Xmlserializera.


Artykuł mówi:

IXmlSerializable jest objęty oficjalną dokumentacją, ale dokumentacja stwierdza, że nie jest przeznaczony do użytku publicznego i nie zawiera żadnych informacji poza tym. Oznacza to, że zespół programistów chciał zarezerwować sobie prawo do modyfikacji, wyłączenia lub nawet całkowitego usunięcia tego haka rozszerzalności. Jednak dopóki jesteś gotów zaakceptować tę niepewność i poradzić sobie z ewentualnymi zmianami w przyszłości, nie ma żadnego powodu, abyś nie mógł z niej skorzystać.

Ponieważ to, proponuję zaimplementować własne IXmlSerializable klasy, aby uniknąć zbyt skomplikowanych implementacji.

...może być łatwo zaimplementować naszą klasę XmlSerializer używając reflection.

 5
Author: Luca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-01 08:02:09

Odkryłem, że Klasa słownika w. Net 2.0 nie jest serializowalna za pomocą XML, ale dobrze serializuje się, gdy używana jest serializacja binarna.

Znalazłem pracę TUTAJ .

 4
Author: Charlie Salts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 19:32:19

Ostatnio dostałem to w Web reference partial class podczas dodawania nowej właściwości. Automatycznie wygenerowana Klasa dodała następujące atrybuty.

    [System.Xml.Serialization.XmlElementAttribute(Order = XX)]

Musiałem dodać podobny atrybut o kolejności wyższej niż ostatnia w automatycznie generowanej sekwencji i to naprawiło to dla mnie.

 3
Author: LepardUK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-17 14:15:18

Ja też myślałem, że Serializowalny atrybut musi być na obiekcie, ale o ile nie jestem kompletnym noobem (jestem w środku nocnej sesji kodowania) , następujące prace z 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();
        }
    }

}

Wyobrażam sobie, że XmlSerializer używa odbicia nad właściwościami publicznymi.

 2
Author: Darren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-13 15:23:04

Miałem sytuację, w której kolejność była taka sama dla dwóch elementów z rzędu

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

.... jakiś kod ...

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

Kiedy zmieniłem kod, aby zwiększyć kolejność o jeden dla każdej nowej właściwości w klasie, błąd zniknął.

 1
Author: Jeremy Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-10 10:57:44

Właśnie dostałem ten sam błąd i odkryłem, że właściwość typu IEnumerable<SomeClass> była problemem. Wygląda na to, że IEnumerable nie może być serializowana bezpośrednio.

 1
Author: jkokorian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 14:35:25

Należy również pamiętać, że nie można serializować kontrolek interfejsu użytkownika i że każdy obiekt, który chcesz przekazać do schowka, musi być serializowalny, w przeciwnym razie nie można go przekazać innym procesom.

 0
Author: Phil Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-13 14:55:17

Używam klasy NetDataSerialiser do serializacji moje zajęcia domenowe. Klasa NetDataContractSerializer .

Klasy domeny są współdzielone między Klientem a serwerem.

 0
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-22 12:27:07

[System.Xml.Serializacja.XmlElementAttribute ("strFieldName", Form = System.Xml.Schemat.XmlSchemaForm.Unqualified)]

/ / LUB

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

 0
Author: Kiran.Bakwad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 11:48:17

Miałem ten sam problem i w moim przypadku obiekt miał ReadOnlyCollection. Zbiór musi zaimplementować metodę Add, aby mógł być serializowany.

 0
Author: Curious Dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 01:19:58