Сериализация и наследование
От: SaZ  
Дата: 24.07.08 13:54
Оценка:
Реализую 2 класса, следующим образом:
class A
{
    public static void Deserialize( string path, ref A param )
    {
        if ( param == null )
            throw new Exception( "param cannot be null" );

        try
        {
            using ( FileStream fs = new FileStream( path, FileMode.Open ) )
            {
                XmlSerializer xs = new XmlSerializer( param.GetType() );
                param = (A)xs.Deserialize( fs );
            }
        }
        catch ( Exception )
        {
            param = (A)Activator.CreateInstance( param.GetType() );
        }
    }
    // ...
}

class B : A
{
    protected int val;
    // ...
}

class Body
{
    private static void Main()
    {
        A b = new B();                      // Если объявить ссылку как B b = new B();, то 

        A.Deserialize( "file.xml", ref b ); // возникает ошибка cannot convert from 'ref B' to 'ref A'
    }
}


Как быть в подобных случаях? Впринципе можно решить проблемму обходным путём с применением интерфейсов, либо с исмользованием дополнительных переменных, например:
B b = new B();
A loader = (A)b;

A.Deserialize( "file.xml", ref loader );
b = (B)loader;

Но хотелось бы получить более элегантное решение. Спасибо за внимание.
Re: Сериализация и наследование
От: stump http://stump-workshop.blogspot.com/
Дата: 25.07.08 05:32
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Но хотелось бы получить более элегантное решение. Спасибо за внимание.

Так получше будет:
public static T Deserialize<T>(string path)
{
T result;
try
{
using ( FileStream fs = new FileStream( path, FileMode.Open ) )
{
XmlSerializer xs = new XmlSerializer( typeof(T));
result = (T)xs.Deserialize( fs );
}
}
catch ( Exception )
{
result = (T)Activator.CreateInstance( typeof(T) );
}
rerurn result;
}
Понедельник начинается в субботу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.