C # десериализовать XML - PullRequest
0 голосов
/ 12 июня 2011

У меня проблема с десериализацией документа в объект с использованием XmlSerializer класса.

Код моей функции для десериализации:

   static public TYPE xmlToObject<TYPE>( string xmlDoc ) {
        MemoryStream stream = new MemoryStream();
        byte[] xmlObject = ASCIIEncoding.ASCII.GetBytes( xmlDoc );
        stream.Write( xmlObject, 0, xmlObject.Length );
        stream.Position = 0;

        TYPE message;

        XmlSerializer xmlSerializer = new XmlSerializer( typeof( TYPE ) );

        try {
            message = (TYPE)xmlSerializer.Deserialize( stream );
        } catch ( Exception e ) {
            message = default( TYPE );
        } finally {
            stream.Close();
        }
        return message;
    }

И у меня есть класс:

    public class Test {
           public int a;
           public int b;
    }

И десериализовать:

    string text = File.ReadAllText( "blue1.xml" );
    Test a = XmlInterpreter.xmlToObject<Test>( text );

Хорошо, когда я читаю файл так:

    <?xml version="1.0" encoding="UTF-8"?>
    <Test>
       <a>2</a>
       <b>5</b>
    </Test> 

все в порядке.Но вот так:

    <?xml version="1.0" encoding="UTF-8"?>
    <Test>
        <a>2</a>
        <b></b>
    </Test> 

неверно, потому что

    <b></b> 

пусто и преобразование в int невозможно.

Как я могу решить это?Например, я хочу в этом контексте, чтобы b не было объявлено.

Что, когда мой класс:

    public class Test {

        public enum Pro {
             VALUE1,
             VALUE2
        }

        public Pro p1;
   }

И я хочу принять xmlDocument, где поле p1 пусто.

1 Ответ

4 голосов
/ 12 июня 2011

Я ожидаю, что первый пример - просто некоторый тип, потому что он также имеет пустой b.Прежде всего, не каждый XML может быть десериализован в объект.Особенно пустые элементы опасны и не должны использоваться.Если вы хотите выразить, что b не определено, не включайте его в файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <a>2</a>
</Test> 

или сделайте свойство b обнуляемым:

public class Test {
       public int a;
       public int? b;
}

и определите XML как:

<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <a>2</a>
    <b xsi:nil="true" />
</Test> 

Обычно, если вы хотите использовать десериализацию, попробуйте сначала использовать сериализацию, чтобы понять, как должен выглядеть действительный XML.

...