Как присвоить значение this?
От: bobik1  
Дата: 14.08.09 21:53
Оценка:
Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает:
this = (Settings)serializer.Deserialize(fs);

т.к. this доступен только для чтения. Не могу сообразить, как это реализовать?
Re: Как присвоить значение this?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 14.08.09 21:59
Оценка:
Здравствуйте, bobik1, Вы писали:

B>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает:

B>
B>this = (Settings)serializer.Deserialize(fs);
B>

B>т.к. this доступен только для чтения.

К this можно присваивать только в структурах.
Re[2]: Как присвоить значение this?
От: bobik1  
Дата: 14.08.09 22:06
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, bobik1, Вы писали:


B>>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает:

B>>
B>>this = (Settings)serializer.Deserialize(fs);
B>>

B>>т.к. this доступен только для чтения.

N>К this можно присваивать только в структурах.


А как в классе подобное реализовать. Кроме как создать еще один класс, десерелизовать в него, а затем присвоить значения атрибутов основному?
Re[3]: Как присвоить значение this?
От: pumpurumer  
Дата: 15.08.09 06:07
Оценка:
Здравствуйте, bobik1, Вы писали:

B>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает:

B>
B>this = (Settings)serializer.Deserialize(fs);
B>

B>т.к. this доступен только для чтения.

я так понимаю вы пишете что-то типа метода Load() который грузить из файла ваш класс ? сам писал эту штуку ручками, всмысле поля класса присваивал как нужно. по идее можно по средсвам reflection перебрать все поля класса и их присвоить, или например не все, а только те, которые помечены какимнибуть атрибутом.
Re: Как присвоить значение this?
От: vasilov  
Дата: 15.08.09 07:08
Оценка:
Здравствуйте, 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();
... << RSDN@Home 1.2.0 alpha 4 rev. 1139>>
Re: Как присвоить значение this?
От: rg45 СССР  
Дата: 15.08.09 07:50
Оценка:
Здравствуйте, bobik1, Вы писали:

B>Пытаюсь прочитать из xml файла атрибуты из того же самого класса. Такая конструкция естественно не работает:

B>
B>this = (Settings)serializer.Deserialize(fs);
B>

B>т.к. this доступен только для чтения. Не могу сообразить, как это реализовать?

Идиома pImpl рулит!
class Settings
{

  //Все внешние обращения делегируются внутреннему
  //объекту _Impl, инкапсулирующему всю реализацию
  public void Method1() { _Impl.Method1(); }
  public void Method2() { _Impl.Method2(); }
  public void Method3() { _Impl.Method3(); }

  //При загрузке объекта из потока происходит полная подмена внутреннего объекта
  public void Load(Stream input)
  {
    Impl newImpl = (Impl)serializer.Deserialize(input);
    using (Impl oldImpl = _Impl)
      _Impl = newImpl;
  }

  #region Implementation
  private Impl _Impl;  

  private class Impl : IDisposable
  {
    public void Method1() { /*...*/}
    public void Method2() { /*...*/}
    public void Method3() { /*...*/}
    //...
    public void Dispose() { /*...*/}

    private object _Field1;
    private object _Field2;
    private object _Field3;
  }
  #endregion
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Как присвоить значение this?
От: HowardLovekraft  
Дата: 15.08.09 10:02
Оценка:
Здравствуйте, rg45, Вы писали:

R>Идиома pImpl рулит!

Кмк, в случае топискстартера рулит статический метод типа "MyClass Load(Stream source)" или конструктор вида "MyClass(Stream source)".
Re[3]: Как присвоить значение this?
От: rg45 СССР  
Дата: 15.08.09 10:12
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, rg45, Вы писали:


R>>Идиома pImpl рулит!

HL>Кмк, в случае топискстартера рулит статический метод типа "MyClass Load(Stream source)" или конструктор вида "MyClass(Stream source)".

Если я правильно понял задачу, то автору топика требуется in-place десериализация. Т.е. десериализуемый объект уже создан до десериализации. Или нет?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Как присвоить значение this?
От: Norex Россия  
Дата: 15.08.09 13:02
Оценка:
Здравствуйте, 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. Но, хочу признаться, идеи у вас весьма извращённые.
Re[4]: Как присвоить значение this?
От: HowardLovekraft  
Дата: 15.08.09 14:20
Оценка:
Здравствуйте, rg45, Вы писали:

R>Если я правильно понял задачу, то автору топика требуется in-place десериализация. Т.е. R>десериализуемый объект уже создан до десериализации. Или нет?


НЯП, понятие десериализации включает а) создание объекта б) восстановление его состояния, сохраненного где-то. Следовательно, "десериализуемый объект уже создан до десериализации" — это как-то нелогично.

Подозреваю, что автор пытается экономить память, не создавая новый объект.
Вообще, было бы неплохо, если бы он объяснил, где, как и зачем он собирается это использовать.
В конце концов, не нравится конструктор MyClass(Stream source), пусть заведет метод
void Assign(Stream source)

и читает состояние объекта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.