2007-12-22

XmlInclude и SoapInclude аттрибуты

Писал давеча Web Service и натолкнулся на баг в платформе .NET. Собственно суть проблемы:

Два класса, базовый и наследник.

public class Foo
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

public class Child : Foo {}

Дальше – метод веб службы:

[WebMethod]
public Foo GetFoo()
{
    Foo foo = new Child();
    return foo;
}

Вызываю – вылетает ошибка:
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Child was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

Ну, вперёд, в MSDN. Ну, думаю, у меня всё-таки WebService, поэтому решил использовать SoapInclude. Почитал про SoapIncludeAttribute – там даже пример есть. Всё просто, надо только указать этот аттрибут веб методу с указанием типа потомка. Получаем:

[WebMethod]
[SoapInclude(typeof(Child))]
public Foo GetFoo()
{
    Foo foo = new Child();
    return foo;
}

Вызываю метод – индейская народная изба, ФигВам называется. Та же ошибка. Перерыл MSDN, немножко погуглил – никакого результата. Дай думаю попробую XmlIncludeAttribute:

[WebMethod]
[XmlInclude(typeof(Child))]
public Foo GetFoo()
{
    Foo foo = new Child();
    return foo;
}

И о чудо! Заработало. Порылся ещё в Интернете – да, действительно, не я один такой наивный, многие на это напарывались и единственное решение, которое было – именно то, что я изложил – использовать XmlInclude, а не SoapInclude.

Вывод: Майкрософт – редиски. ;)

P.S. Может кто-то знает в чём причина этой проблемы и почему пример из MSDN не работает?

2007-12-09

Трудности перевода

Вот так вот начиналось предложение о новой работе:
Opportunity for very god job.
Visma is the biggest software producer in Scandinavia.
Sins two month we are independent part of it in Poland.

Последнее предложение дословно: «Грехи два месяц мы являемся независимым подразделением её (компании Визма) в Польше»

Крупнейший производитель софта в Скандинавии, а людей, знающих английский – нет. А может это шок, вызванный отделением от основного подразделения и обретением независимости? Вообщем, не вызывают у меня доверия такие объявления из-за пределов моей Родины.

2007-12-04

Singleton в .NET

Читаю тут книжку по C# и .NET 2.0. Столкнулся с новым для себя моментом - volatile keyword. Начал выяснять, где его можно использовать. Друг показал на статью http://msdn2.microsoft.com/en-us/library/ms954629.aspx. В этой статье рассказывается про потокобезопасную реализацию Singleton. Сначала в C++, потом решение портируется на Java и C#. Тут как раз и появляются volatile поля. Ну а в нагрузку и два if с lock.
А дальше идёт другой пример на C#:
sealed class Singleton
{
  private Singleton() {}
  public static readonly Singleton Instance = new Singleton();
}
Мне не сильно нравится использовать прямой доступ к полям, поэтому я его немного изменил:
public sealed class Singleton
{
  private static readonly Singleton _instance = new Singleton();
  private Singleton() { }
  public static Singleton Instance
  {
    get { return _instance; }
  }
}
Так, а что с потокобезопасностью в этом случае?
Платформа .NET гарантирует потокобезопасную инициализацию статических членов. То есть гарантирует, что всегда будет создан только один экземпляр класса.
А вот с lazy инициализацией не всё так просто. Статические поля инициализируются при первом обращении к любому члену класса. То есть, в данном случае, чтобы иметь lazy инициализацию, в классе должен быть только один статический публичный член, который и будет обеспечивать доступ к экзепляру. Только так мы сможем предотвратить инициализацию экземпляра раньше того момента, когда он может понадобиться.
На мой взгляд, это не самое большое ограничение.

2007-08-30

А не покнутить ли кого?

Я вот думаю, как заставить человека заняться самообразрванием, даже если он не понимает, что ему нехватает знаний. И при этом, в каждой попытке донести до него эту мысль, я встречаю такой отпор, что у меня опускаются руки. А парень, вообще-то неплохой.

2007-08-29

Мы открылись.

Вообщем и до меня докатилась волна ведения дневника. Пока я не решил, что тут буду писать (да и буду ли вообще), но всё-таки.