code

XmlSerializer - 유형을 반영하는 동안 오류가 발생했습니다.

starcafe 2023. 5. 23. 22:04
반응형

XmlSerializer - 유형을 반영하는 동안 오류가 발생했습니다.

. 2하여 C# .NET 2.0을 하는 복합 있습니다.[Serializable]그것에 대한 속성.다음을 만드는 중입니다.XMLSerializer클래스를 지정하고 생성자에게 전달합니다.

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

다음과 같은 예외가 발생했습니다.

유형을 반영하는 동안 오류가 발생했습니다.

데이터 클래스 안에 다른 복합 개체가 있습니다.도 이또한필까니합요것?▁▁have▁to니▁need가 필요합니까?[Serializable]속성, 또는 그것을 맨 위의 객체에 가짐으로써, 그것은 그것을 내부의 모든 객체에 재귀적으로 적용합니까?

당신이 받고 있는 내면의 예외를 보세요.직렬화에 문제가 있는 필드/속성을 알려줍니다.

필드/속성을 속성으로 장식하여 xml 직렬화에서 제외할 수 있습니다.

XmlSerializer속성을 사용하지 않기 때문에 그게 문제인지 의심스럽습니다.

직렬화된 클래스에는 기본(즉, 매개 변수가 없는) 생성자가 있어야 합니다.생성자가 전혀 없는 경우에는 괜찮지만 매개 변수가 있는 생성자가 있는 경우에는 기본 생성자도 추가해야 합니다.

저도 비슷한 문제가 있었는데, 알고 보니 시리얼라이저가 같은 이름의 수업 2개(하나는 다른 하나의 하위 수업)를 구분할 수 없었습니다.내부 예외는 다음과 같습니다.

'기본 네임스페이스를 입력합니다.Class1' 및 '기본 네임스페이스'입니다.하위 네임스페이스입니다.Class1'은(는) 네임스페이스 ' '의 XML 형식 이름 'Class1'을(를) 사용합니다.XML 특성을 사용하여 유형에 대한 고유한 XML 이름 및/또는 네임스페이스를 지정합니다.

기본 네임스페이스입니다.하위 네임스페이스입니다.Class1은 기본 네임스페이스의 하위 클래스입니다.1급.

클래스 중 하나에 속성을 추가해야 했습니다(기본 클래스에 추가했습니다).

[XmlType("BaseNamespace.Class1")]

참고: 클래스 계층이 더 많은 경우 클래스에 속성도 추가해야 합니다.

나의 가장 일반적인 이유:

 - the object being serialized has no parameterless constructor
 - the object contains Dictionary
 - the object has some public Interface members

또한 주의할 점은XmlSerializer추상 속성을 직렬화할 수 없습니다.솔루션 코드를 추가한 질문은 여기를 참조하십시오.

XML 직렬화 및 상속된 유형

직렬화 그래프의 모든 개체는 직렬화 가능해야 합니다.

때부터XMLSerializer는 블랙박스입니다. 직렬화 프로세스로 디버그하려면 이 링크를 선택하십시오.

XmlSerializer가 임시 어셈블리를 출력하는 위치 변경

방법: .NET XmlSerializer 생성 어셈블리로 디버그

특정 속성(예: 사전 또는 클래스)을 처리해야 하는 경우 IXmlSerialable 인터페이스를 구현할 수 있습니다. 이 인터페이스를 사용하면 보다 자세한 코딩 작업을 수행할 수 있습니다.

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
}

XmlSerializer를 "확장"하는 정교한 방법을 구현하는 우아한 방법을 보여주는 흥미로운 기사가 있습니다.


이 기사에는 다음과 같은 내용이 있습니다.

IXmlSerializable은 공식 설명서에서 다루지만 설명서에는 공개 용도가 아니며 그 이상의 정보는 제공되지 않는다고 나와 있습니다.이는 개발 팀이 이러한 확장성 고리를 수정, 비활성화 또는 완전히 제거할 수 있는 권한을 보유하고자 했음을 나타냅니다.하지만, 여러분이 이 불확실성을 기꺼이 받아들이고 미래에 일어날 수 있는 변화에 대처할 의지가 있는 한, 여러분이 그것을 이용하지 못할 이유는 전혀 없습니다.

왜냐면 이건 당신이 당신 자신의 것을IXmlSerializable클래스, 너무 복잡한 구현을 방지하기 위해.

정의를 하는 것은 .사용자 정의를 구현하는 것이 간단할 수 있습니다.XmlSerializer성찰을 이용한 수업

방금 같은 오류가 발생하여 유형 속성이IEnumerable<SomeClass>문제였습니다.는 것 같습니다.IEnumerable직접 직렬화할 수 없습니다.

대신에, 누군가는 사용할 수 있습니다.List<SomeClass>.

에서 사전 클래스를 찾았습니다.Net 2.0은 XML을 사용하여 직렬화할 수 없지만 이진 직렬화를 사용하면 직렬화가 잘 됩니다.

근처에서 일을 찾았습니다.

나는 최근에 새로운 속성을 추가할 때 웹 참조 부분 클래스에서 이것을 얻었습니다.자동 생성된 클래스에서 다음 특성을 추가하고 있습니다.

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

자동 생성된 시퀀스에서 마지막 순서보다 높은 순서를 가진 유사한 속성을 추가해야 했고 이를 통해 수정되었습니다.

저도 Serializable 특성이 객체에 있어야 한다고 생각했지만, 제가 완전한 nob(심야 코딩 세션 중)이 아닌 이상 SnipetCompiler에서 다음 작업을 수행합니다.

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가 공용 속성에 대한 반영을 사용하고 있다고 생각합니다.

때때로, 이러한 유형의 오류는 인수가 없는 클래스의 구성자가 없기 때문입니다.

두 개의 연속된 요소에 대해 주문이 동일한 상황이 발생했습니다.

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

어떤 코드...

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

클래스의 새 Property마다 하나씩 순서를 올리도록 코드를 변경했더니 오류가 사라졌습니다.

데이터 유형이 있는 속성을 만들 때 동일한 오류가 발생했습니다.Type이에 대해 오류가 발생했습니다. 유형을 반영하는 오류가 발생했습니다.디버그 독에서 모든 예외의 'InnerException'을 계속 확인하고 특정 필드 이름을 얻었습니다.Type) 제 경우에는.솔루션은 다음과 같습니다.

    [XmlIgnore]
    public Type Type { get; set; }

또한 사용자 인터페이스 컨트롤을 직렬화할 수 없으며 클립보드로 전달할 개체는 직렬화해야 합니다. 그렇지 않으면 다른 프로세스로 전달할 수 없습니다.

나는 그것을 사용해 왔습니다.NetDataSerialiser내 도메인 클래스를 직렬화하는 클래스.NetDataContractSerializer 클래스입니다.

도메인 클래스는 클라이언트와 서버 간에 공유됩니다.

저도 같은 문제가 있었고 제 경우 개체에 읽기 전용 컬렉션이 있었습니다.컬렉션이 직렬화되려면 Add 메서드를 구현해야 합니다.

저는 지금까지 여기에 설명된 모든 것에 대해 약간 다른 해결책을 가지고 있습니다. 그래서 미래의 문명을 위해 여기 제 것입니다!

원래 유형이 "시간"이었기 때문에 데이터 유형을 선언했습니다.TimeSpan그리고 그 후에 a로 변경되었습니다.String:

[System.Xml.Serialization.XmlElementAttribute(DataType="time", Order=3)]

하지만 실제 유형은 문자열이었습니다.

public string TimeProperty {
    get {
        return this.timePropertyField;
    }
    set {
        this.timePropertyField = value;
        this.RaisePropertyChanged("TimeProperty");
    }
}

를 제거함으로써DateType재산을 소유함Xml직렬화 가능

[System.Xml.Serialization.XmlElementAttribute(Order=3)]
public string TimeProperty {
    get {
        return this.timePropertyField;
    }
    set {
        this.timePropertyField = value;
        this.RaisePropertyChanged("TimeProperty");
    }
}
[System.Xml.Serialization.XmlElementAttribute("strFieldName", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]

또는

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

언급URL : https://stackoverflow.com/questions/60573/xmlserializer-there-was-an-error-reflecting-type

반응형