Сериализация DataContract унаследованного типа в базовый тип - PullRequest
3 голосов
/ 10 декабря 2010

Я пытаюсь сериализовать класс B как экземпляр базового класса A. DataContractSerializer не позволит мне сделать это.

Пример сбоя сериализации:

class Program
{
    [DataContract]
    public class A
    {
        public int Id { get; set; }
    }

    [DataContract]
    public class B : A
    {

    }


    static void Main(string[] args)
    {
        A instance = new B { Id = 42 };

        var dataContractSerializer = new DataContractSerializer(typeof(A));
        var xmlOutput = new StringBuilder();
        using (var writer = XmlWriter.Create(xmlOutput))
        {
            dataContractSerializer.WriteObject(writer, instance);
        }

    }
}

Я знаю, что проблема легко решается добавлением атрибута KnownTypes. Однако я хочу сохранить класс B скрытым от проекта (не добавлять ссылку).

Можно ли вообще добиться того, чего я хочу? Я попробовал XmlSerializer, но он дал мне ту же проблему (он добавил полное имя типа экземпляра в XML) и намного более неудобен в использовании.

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010
[DataContract(Name="YouCannotSeeMyName")]
[KnownTypes(typeof(B))]
public class B : A

И вы получите

<A itype="YouCannotSeeMyName">
  ...
</A>
1 голос
/ 10 декабря 2010

Я почти уверен, что вы не можете скрыть части договора.Это похоже на работу с веб-сервисом, где контракт должен выполняться для каждого конца, чтобы понять, как и что сериализировать / десериализовать.

Кроме того, вы можете передать тип B в DataContractSerializerпо сравнению с использованием атрибута.

    class Program
    {
        [DataContract]
        public class A
        {
            public int Id { get; set; }
        }

        [DataContract]
        public class B : A
        {

        }

        static void Main(string[] args)
        {
            A instance = new B { Id = 42 };

            var dataContractSerializer = new DataContractSerializer(typeof(A), new List<Type>() { typeof(B) });
            var xmlOutput = new StringBuilder();
            using (var writer = XmlWriter.Create(xmlOutput))
            {
                dataContractSerializer.WriteObject(writer, instance);
            }

        }
    }

Что даст вам ...

<Program.A xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:type="Program.B"
xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...