Писал давеча 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-22
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.
Последнее предложение дословно: «Грехи два месяц мы являемся независимым подразделением её (компании Визма) в Польше»
Крупнейший производитель софта в Скандинавии, а людей, знающих английский – нет. А может это шок, вызванный отделением от основного подразделения и обретением независимости? Вообщем, не вызывают у меня доверия такие объявления из-за пределов моей Родины.
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 инициализацию, в классе должен быть только один статический публичный член, который и будет обеспечивать доступ к экзепляру. Только так мы сможем предотвратить инициализацию экземпляра раньше того момента, когда он может понадобиться.
На мой взгляд, это не самое большое ограничение.
А дальше идёт другой пример на 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
Мы открылись.
Вообщем и до меня докатилась волна ведения дневника. Пока я не решил, что тут буду писать (да и буду ли вообще), но всё-таки.
Subscribe to:
Posts (Atom)