Сериализация производного типа без атрибутов типа и пространства имен - PullRequest
1 голос
/ 11 апреля 2011

У меня есть xml API, который я должен имитировать символ для символа.Я пытаюсь использовать встроенную функцию сериализации XML в .NET, но она добавляет некоторые дополнительные атрибуты.В веб-службе NORMAL или API xml эти атрибуты не повредят ничему и могут даже служить цели.Но они неожиданные персонажи, и, к сожалению, я не могу их допустить.Итак, вот что я хотел бы сделать (с гипотетическими объектами, конечно):

У меня есть базовый тип

public abstract class Instrument { }

... и у меня естьпроизводный тип

public class Guitar : Instrument { }

... и я хотел бы сериализовать производный тип в нечто вроде этого:

<Guitar />

Вместо, Я получаю это:

<Instrument d1p1:type="Guitar" xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance" />

Вот тест, с которым я работаю:

[TestClass]
public class when_serializing_a_guitar
{
    private XmlSerializer _serializer;
    private string _expectedXml;
    private StringWriter _stringWriter;
    private string _actualXml;
    private XmlSerializerNamespaces _ns;
    private XmlWriter _xmlWriter;

    private void WithThisContext()
    {
        _ns = new XmlSerializerNamespaces();
        _ns.Add("", "");

        _stringWriter = new StringWriter();
        _xmlWriter = XmlWriter.Create(_stringWriter, new XmlWriterSettings
                                                         {
                                                             OmitXmlDeclaration = true,
                                                             CloseOutput = false
                                                         });

        _serializer = new XmlSerializer(typeof(Instrument), new[] { typeof(Guitar) });

        _expectedXml = @"<Guitar />";
    }

    private void BecauseOfThisAction()
    {
        _serializer.Serialize(_xmlWriter, new Guitar(), _ns);
        _actualXml = _stringWriter.ToString();
    }

    [TestMethod]
    public void it_should_return_the_expected_properly_formatted_xml()
    {
        WithThisContext();
        BecauseOfThisAction();
        Assert.AreEqual(_expectedXml, _actualXml);
    }
}

Знаете, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Я предполагаю, что вам нужно сохранить иерархию модели домена без изменений.В противном случае вы можете просто сделать это: var serializer = new XmlSerializer (typeof (Guitar));

Если вам нужно сохранить его в целости, я предлагаю вам написать свои собственные методы ToXml для каждого из ваших доменных объектов.

public interface IXmlWritable
{
    string ToXml();
}

public class Instrument : IXmlWritable
{
    public string classification { get; set; }

    public string ToXml()
    {
        return "<Instrument classification='" + classification + "' />";
    }
}

Или что-то в этом роде в зависимости от того, как вы хотите перебирать узлы.

0 голосов
/ 11 апреля 2011

Вы можете использовать XElement из System.Xml.Linq (вам нужно добавить ссылку на него с помощью «добавить ссылку»). Это код для простого создания чистого XML-документа:

XElement el = new XElement("data", new XElement("guitar"));

el.Save(@"D:\test.xml", SaveOptions.None);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...