Простенький такой вопросик про десериализацию
От: Sanych  
Дата: 28.03.11 14:24
Оценка:
У меня есть схема xsd, которая описывает несколько root элементов. На основе этой схемы построен класс, используя xsd.exe
Есть ли какой либо простой способ определять элемент какого типа в файле является root'ом (без повторных прогонок десериализатором)?
Т.е.
есть, например такой xml

<systemError>
  <code></code>
  <message></message>
</systemError>


и такой

<result>
  <property name=""></property>
</result>


Соответственно, есть классы systemErrorType и resultType
Можно ли это как-нибудь просто и красиво обработать?
Re: Простенький такой вопросик про десериализацию
От: RushDevion Россия  
Дата: 28.03.11 17:44
Оценка:
Если я правильно понял вашу задачу, то:
-На входе имеем некий XML-контент и набор типов, сгенерированных xsd
-Требуется понять, какой из типов использовать для десериализации данного XML

Можно сделать, например, так:

public object Deserialize( Stream stream, out Type type )
{
    var type = DetectType( stream );
    var ser = new XmlSerializer( type );
    return ser.Deserialize( stream );
}

static Type DetectType( Stream stream )
{
    var settings = new XmlReaderSettings
    {
        CloseInput = false,
        IgnoreComments = true,
        IgnoreProcessingInstructions = true,
    };
    long pos = stream.Position;
    try
    {
        using ( var reader = XmlReader.Create( stream, settings ) )
        {
            reader.MoveToContent();
            switch ( reader.LocalName )
            {
                case "systemError": return typeof( systemErrorType );
                case "result": return typeof( resultType );
                default:
                    throw new InvalidOperationException( "Unknown xml format" );
            }
        }
    }
    finally { stream.Position = pos; }
}
Re[2]: Простенький такой вопросик про десериализацию
От: Sanych  
Дата: 29.03.11 09:03
Оценка:
Здравствуйте, RushDevion, Вы писали:

Спасибо за идею...
Буду пробовать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.