Здравствуйте, nikov, Вы писали:
N>Здравствуйте, bobik1, Вы писали:
B>>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает: B>>
Здравствуйте, bobik1, Вы писали:
B>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает: B>
B>this = (Settings)serializer.Deserialize(fs);
B>
B>т.к. this доступен только для чтения.
я так понимаю вы пишете что-то типа метода Load() который грузить из файла ваш класс ? сам писал эту штуку ручками, всмысле поля класса присваивал как нужно. по идее можно по средсвам reflection перебрать все поля класса и их присвоить, или например не все, а только те, которые помечены какимнибуть атрибутом.
Здравствуйте, bobik1, Вы писали:
B>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает: B>
B>this = (Settings)serializer.Deserialize(fs);
B>
B>т.к. this доступен только для чтения. Не могу сообразить, как это реализовать?
Как-нибудь вот так
public static Setting Load()
{
try
{
string xml = File.ReadAllText(SettingFileName);
var reader = new StringReader(xml);
var sr = new XmlSerializer(typeof (Setting));
return (Setting) sr.Deserialize(reader);
}
catch (Exception)
{
return new Setting();
}
}
Только вместо Setting setting = new Setting();
Setting setting = Setting.Load();
Здравствуйте, rg45, Вы писали:
R>Идиома pImpl рулит!
Кмк, в случае топискстартера рулит статический метод типа "MyClass Load(Stream source)" или конструктор вида "MyClass(Stream source)".
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, rg45, Вы писали:
R>>Идиома pImpl рулит! HL>Кмк, в случае топискстартера рулит статический метод типа "MyClass Load(Stream source)" или конструктор вида "MyClass(Stream source)".
Если я правильно понял задачу, то автору топика требуется in-place десериализация. Т.е. десериализуемый объект уже создан до десериализации. Или нет?
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, bobik1, Вы писали:
B>А как в классе подобное реализовать. Кроме как создать еще один класс, десерелизовать в него, а затем присвоить значения атрибутов основному?
А как вам такое:
public class MyClass
{
private void MyClass()
{
}
public void Foo() { }
public static MyClass CreateAndLoad()
{
MyClass result = (MyClass)Deserialize(...);
return result;
}
}
// var target = MyClass.CreateAndLoad();
// target.Foo();
p.s. Но, хочу признаться, идеи у вас весьма извращённые.
Здравствуйте, rg45, Вы писали:
R>Если я правильно понял задачу, то автору топика требуется in-place десериализация. Т.е. R>десериализуемый объект уже создан до десериализации. Или нет?
НЯП, понятие десериализации включает а) создание объекта б) восстановление его состояния, сохраненного где-то. Следовательно, "десериализуемый объект уже создан до десериализации" — это как-то нелогично.
Подозреваю, что автор пытается экономить память, не создавая новый объект.
Вообще, было бы неплохо, если бы он объяснил, где, как и зачем он собирается это использовать.
В конце концов, не нравится конструктор MyClass(Stream source), пусть заведет метод