Упаковка XMLSerializer - PullRequest
       8

Упаковка XMLSerializer

1 голос
/ 19 марта 2012

Я хочу поместить XMLSerializer позади моего класса 'фасадов', чтобы пользователю не приходилось предоставлять информацию о типе конструктору.Но у этого есть проблема.Рассмотрим этот класс:

Class XmlFormatter
    Private Shared xs As XmlSerializer

    Public Function Deserialize(ByVal serializationStream As Stream) As Object
        Dim o As Object = Nothing
        If Not xs Is Nothing Then
            o = xs.Deserialize(serializationStream)
        End If
        Return o
    End Function

    Public Overloads Sub Serialize(ByVal serializationStream As Stream, ByVal graph As Object)
        If xs Is Nothing Then
            xs = New XmlSerializer(graph.GetType())
        End If
        xs.Serialize(serializationStream, graph)
    End Sub
End Class

Проблема заключается в том, что пользователь этого класса не может использовать десериализацию без предварительного использования Serialize, поскольку экземпляр XMLSerializer создан в Serialize и является общим.Но использование десериализации без этого экземпляра просто ничего не даст.Можно ли решить эту проблему?

1 Ответ

0 голосов
/ 19 марта 2012

XmlSerializer не включает тип, потому что для XmlSerializer принято решение, что тип не важен . Следующие 100% совместимы, например:

namespace X {
    public class A {
        public string B;
    }
}
namespace Y.Z {
    [XmlRoot("A"), XmlType("A")]
    public class C {
        [XmlElement("B")]
        public string D {get;set;}
    }
}

Это ИМО самый полезный подход, который позволяет:

  • простое использование с сгенерированными типами / типами прокси
  • переключение между POCO / DTO
  • кросс-платформенное и кросс-архитектурное использование (например, использование "полного .NET" сервиса из WP7 / SL / XNA
  • простое управление версиями без строгой связи между клиентом и сервером

По сути, я придерживаюсь мнения, что клиент должен точно знать, чего он ожидает, и что полагаться на тип - неправильный подход.

...