[C#] .NET XML 직렬화 문제? [닫은]

C # XML 직렬화를 수행 할 때 몇 가지 문제가 발생했습니다.


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

[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
{
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

        bool wasEmpty = reader.IsEmptyElement;
        reader.Read();

        if (wasEmpty)
            return;

        while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
        {
            reader.ReadStartElement("item");

            reader.ReadStartElement("key");
            TKey key = (TKey)keySerializer.Deserialize(reader);
            reader.ReadEndElement();

            reader.ReadStartElement("value");
            TValue value = (TValue)valueSerializer.Deserialize(reader);
            reader.ReadEndElement();

            this.Add(key, value);

            reader.ReadEndElement();
            reader.MoveToContent();
        }
        reader.ReadEndElement();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

        foreach (TKey key in this.Keys)
        {
            writer.WriteStartElement("item");

            writer.WriteStartElement("key");
            keySerializer.Serialize(writer, key);
            writer.WriteEndElement();

            writer.WriteStartElement("value");
            TValue value = this[key];
            valueSerializer.Serialize(writer, value);
            writer.WriteEndElement();

            writer.WriteEndElement();
        }
    }
}

다른 XML 직렬화 문제가 있습니까?



답변

또 다른 큰 문제 : 웹 페이지 (ASP.NET)를 통해 XML을 출력 할 때 Unicode Byte-Order Mark 를 포함하고 싶지 않습니다 . 물론 BOM을 사용하거나 사용하지 않는 방법은 거의 동일합니다.

BAD (BOM 포함) :

XmlTextWriter wr = new XmlTextWriter(stream, new System.Text.Encoding.UTF8);

좋은:

XmlTextWriter  wr = new XmlTextWriter(stream, new System.Text.UTF8Encoding(false))

BOM을 원하지 않음을 나타 내기 위해 명시 적으로 false를 전달할 수 있습니다. 사이의 명확하고 분명한 차이점에 주목 Encoding.UTF8UTF8Encoding.

처음에 추가 된 3 개의 BOM 바이트는 (0xEFBBBF) 또는 (239187191)입니다.

참조 : http://chrislaco.com/blog/troubleshooting-common-problems-with-the-xmlserializer/


답변

아직 댓글을 달 수 없어서 Dr8k의 게시물에 댓글을 달고 또 다른 관찰을하겠습니다. 공용 getter / setter 속성으로 노출되고 이러한 속성을 통해 직렬화 / 역 직렬화되는 개인 변수. 우리는 항상 예전 직장에서 해냈습니다.

하지만 한 가지 주목할 점은 해당 속성에 논리가있는 경우 논리가 실행되기 때문에 직렬화 순서가 실제로 중요하다는 것입니다. 멤버는 코드에서 정렬 된 방식에 따라 암시 적으로 정렬되지만 특히 다른 개체를 상속하는 경우에는 보장되지 않습니다. 명시 적으로 주문하는 것은 후방의 고통입니다.

나는 과거에 이것에 타 버린 적이 있습니다.


답변

메모리 스트림에서 XML 문자열로 직렬화 할 때 MemoryStream # GetBuffer () 대신 MemoryStream # ToArray ()를 사용해야합니다. 그렇지 않으면 할당 된 추가 버퍼로 인해 제대로 역 직렬화되지 않는 정크 문자로 끝납니다.

http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer(VS.80).aspx


답변

serializer가 유형으로 인터페이스가있는 멤버 / 속성을 발견하면 직렬화되지 않습니다. 예를 들어 다음은 XML로 직렬화되지 않습니다.

public class ValuePair
{
    public ICompareable Value1 { get; set; }
    public ICompareable Value2 { get; set; }
}

이것은 직렬화되지만 :

public class ValuePair
{
    public object Value1 { get; set; }
    public object Value2 { get; set; }
}


답변

IEnumerables<T>수익률을 통해 생성 된 것은 직렬화 할 수 없습니다. 이는 컴파일러가 yield return을 구현하기 위해 별도의 클래스를 생성하고 해당 클래스가 직렬화 가능으로 표시되지 않기 때문입니다.


답변

읽기 전용 속성을 직렬화 할 수 없습니다. XML을 객체로 변환하기 위해 deserialization을 사용하지 않더라도 getter와 setter가 있어야합니다.

같은 이유로 인터페이스를 반환하는 속성을 직렬화 할 수 없습니다. deserializer는 인스턴스화 할 구체적인 클래스를 알지 못합니다.


답변

오 여기 좋은 것이 있습니다. XML 직렬화 코드가 생성되어 별도의 DLL에 배치되기 때문에 코드에 직렬화를 중단시키는 실수가 있어도 의미있는 오류가 발생하지 않습니다. “s3d3fsdf.dll을 찾을 수 없음”과 같은 것입니다. 좋은.