Как в .NET преобразовать тип (класс) в XSD схему?

blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Как в .NET преобразовать тип (класс) в XSD схему?

Post by blanko27 »

Есть утилита xsd.ехе и примеры таких преобразований, но преобразование получается неоднозначное. Почему-то не преобразуются методы класса и некоторые атрибуты (например ReadOnly или DefaultValue). Имеются ли какие-то стандартные функции для однозначного преобразования? (Например создать свой CodeNamespace и экспортировать его в XmlSchema, или что-то типа этого?)
Спасибо!
User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Post by Okie »

А разве schema поддерживает методы? 8O По-моему, это просто способ описывать допустимый формат xml-документов, а не язык программирования. Поэтому нетривиальные ограничения на элементы xml-документа в рамках xsd schema описать нельзя, и тогда бывает нужно дополнительную валидацию делать руками. Default values, впрочем, XSD поддерживает.
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Okie wrote:А разве schema поддерживает методы? 8O
А это не важно, главное - что она поддерживает типы. Опишите интерфеис метода каким-либо типом - и все ОК. Проблема в том, что я не вижу этой возможности built-in так-сказать.
User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Post by Okie »

blanko27 wrote:
Okie wrote:А разве schema поддерживает методы? 8O
А это не важно, главное - что она поддерживает типы. Опишите интерфеис метода каким-либо типом - и все ОК. Проблема в том, что я не вижу этой возможности built-in так-сказать.

Ну в таком случае это звучит похоже на SOAP. Вот, например: http://msdn.microsoft.com/webservices/understanding/webservicebasics/default.aspx?pull=/library/en-us//dnsoap/html/understandsoap.asp, глава RPC and Encoding.

.Net генерирует SOAP spec (или как она там называется) для web services вполне автоматически. Попробуйте создать web service project и потом посмотрите на auto generated файлы в этом проекте.
Volant
Уже с Приветом
Posts: 1346
Joined: 22 Sep 2001 09:01
Location: Dallas TX, USA

Re: Как в .NET преобразовать тип (класс) в XSD схему?

Post by Volant »

Я так понимаю Вам нужно сериализовать-десериалиазовать класс.

Опишите задачу на более высоком уровне, пожалуйста.

Вам нужен:
Удаленный доступ к обьекту (методам объекта)?
Копирование обьекта в другой AppDomain?
Сохранине состояния обьекта на диске (в форме XML) с последующим восстановлением?
Last edited by Volant on 23 Dec 2003 00:50, edited 1 time in total.
User avatar
SippyFox
Новичок
Posts: 66
Joined: 31 Jul 2003 14:14
Location: SPb->USA

Post by SippyFox »

Я не совсем поняла, чего сделать-то надо.
Если вопрос по схеме то вам сюда http://www.w3.org/XML/Schema

А если по ютилите, то опишите, плиз, задачу. Оч. интересно.
Единственно, что может спасти смертельно раненного кота, -- это глоток бензина...
Volant
Уже с Приветом
Posts: 1346
Joined: 22 Sep 2001 09:01
Location: Dallas TX, USA

Post by Volant »

SippyFox wrote:Я не совсем поняла, чего сделать-то надо.
.

Сериализовать объкт класса (типа). Но не понятно для чего (Ответ, "для того, чтобы потом десериализовать", не принимается! :) )
HomeZombi
Уже с Приветом
Posts: 207
Joined: 09 Sep 2001 09:01
Location: Seattle, WA

Post by HomeZombi »

.Net генерирует SOAP spec (или как она там называется) для web services вполне автоматически. Попробуйте создать web service project и потом посмотрите на auto generated файлы в этом проекте.


Ваша xsd базируется на xml, который вы создаете из .Net типа, а не напрямую на .Net типе. Поэтому все зависит от того как вы сериализуете свой тип (если в SOAP, то для него есть свой xsd).

Попробуйте сериализовать свой тип в xml, используя [Serializable] и другие аттрибуты, а затем создать из полученного xml схему в Visual Studio.
Monoid
Posts: 12
Joined: 29 Aug 2003 15:22
Location: NJ, USA

Post by Monoid »

Непонятно как можно сериализовать метод класса, а потом его десериализовать :)
User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Post by Okie »

Monoid wrote:Непонятно как можно сериализовать метод класса, а потом его десериализовать :)

Я так понял, что речь идет о signature метода, а не о его коде.
User avatar
SippyFox
Новичок
Posts: 66
Joined: 31 Jul 2003 14:14
Location: SPb->USA

Post by SippyFox »

Я так понимаю, что нужно создавать
Custom Attribute для Attributes that Control XML Serialization в вашем проекте.
В MSDN есть статья, но маленькая.


Напишите, плиз, что там у вас получилось. И опишите задачу.
Единственно, что может спасти смертельно раненного кота, -- это глоток бензина...
Bobo
Уже с Приветом
Posts: 518
Joined: 04 Jun 2002 01:40
Location: CA, USA

Post by Bobo »

Никакой serializer или formatter описывать тип не будет.
Serialization - это описание state of an instance.
Описанием типов занимается WSDL (как справедливо заметил Okie).
Это реализовано в классе System.Runtime.Remoting.MetadataServices.Metadata а также в утилите soapsuds.exe.
Альтернатива - реализовать ручками: пройтись по reflection и выплюнуть описания мемберов в cxему. Это просто, я писал свой сериализер примерно таким способом. Только здесь, в отличие от сериализера, не совсем ясно, как сделать обратное преобразование - создать тип по описанию. Единственная идея - сгенерить source code.
Еще есть такая вешь как CodeDOM, которая может здесь помочь, но я с ней не разбирался.
Присоединяюсь к вопросу "зачем это нужно?"
Monoid
Posts: 12
Joined: 29 Aug 2003 15:22
Location: NJ, USA

Post by Monoid »

Bobo wrote:Описанием типов занимается WSDL


Вы не совсем правы. Типы данных описываются в XML-Schema. WSDL описывает operations (т.е. methods), bindings (т.е. какой транспорт(ы) надо использовать дла конкретной operation), service (физический адрес сервера который может выполнить эту операцию). WSDL может в себе содержать фрагмент XSD (schema) описывающий типы данных а может импортировать их из внешнегo XSD файла. Вы совершенно правы в том что полностью C# тип в XSD описать нельзя - нет понятия о методах. Для этого нужно комбинация XSD и WSDL.

Okie wrote:Я так понял, что речь идет о signature метода, а не о его коде.

Как и зачем можно сериализовать/десериализовать signature метода и что вообще под этим понимается? Например, есть клас с методом: void Foo( int a ); Что понимать под сериализацией signature такого метода? Если речь идёт о WSDL то это не сериализация а генерция репрезентации этого метода в определёный формат, в данном, случае WSDL. А можно было бы например нагенерить тоже самое в IDL.
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Спасибо огромное всем ответившим, я не сразу добрался до своего компьютера, а с работы ответить не было возможности.
В двух словах - мне нужна определенная кастомизация аппликации, не известно заранее с каким типом данных я буду работать. Начальники у меня напористые ребята - хотят .NET и XML для описания интерфейса типов. Я начал с поисков нечто подобного Jaxb, JaxMe но на платформе .NET, в круг поисков попали XSD, WSDL, SOAP. Так же, как сказала SippyFox я чуть-чуть поигрался с XmlAttributes и XmlAttributeOverrides (пример в конце http://www.dotnet247.com/247reference/m ... 13952.aspx ), но понял, что это мне не помогает. Потом, как и сказал Bobo, я двинулся в направлении CodeNamespace и CodeDOM, но пока не нашел как из CodeNamespace создать XmlSchema (т.е можно все преобразовать вручную, но не хотелось бы самому создавать стандарты). По-видимому дальше, как и сказал Okie буду двигаться в направление WSDL, хотя это и кажется немного кривым - прикручивать в локальную аппликацию схему для описания веб сервисов. Вооще если кто-то может предложить какой-то другой подход для XML-описания типов в .NET буду очень рад. Проблемы с их динамическим созданием и работой с ними через Reflection нет, интересуют именно вопросы сериализации. :radio%:
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Monoid wrote:...Например, есть клас с методом: void Foo( int a ); Что понимать под сериализацией signature такого метода?...
Примерно так, согласно Don Box-у:
Operations in IDL:
void CommitChanges();
double GetPrice(in int id);
bool SetPrice(in int id, ref double price,
out bool instock);
Operations as structs in IDL:
struct CommitChanges { };
struct CommitChangesResponse { };
struct GetPrice { int id; };
struct GetPriceResponse { double __return; };
struct SetPrice { int id; double price; };
struct SetPriceResponse { bool __return; bool instock; };
Operations as structs in XSD:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- global element declaration elided for compactness -->
<xsd:complexType name="CommitChanges" />
<xsd:complexType name="CommitChangesResponse" />
<xsd:complexType name="GetPrice" >
<xsd:sequence>
<xsd:element name="id" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="GetPriceResponse" >
<xsd:sequence>
<xsd:element name="__return" type="xsd:double" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SetPrice" >
<xsd:sequence>
<xsd:element name="id" type="xsd:int" />
<xsd:element name="price" type="xsd:double" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SetPriceResponse" >
<xsd:sequence>
<xsd:element name="__return" type="xsd:bool" />
<xsd:element name="instock" type="xsd:bool" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Monoid wrote:Если речь идёт о WSDL то это не сериализация а генерция репрезентации этого метода в определёный формат, в данном, случае WSDL. А можно было бы например нагенерить тоже самое в IDL.
Имеется ли встроенная возможность в .NET програмно генерировать IDL? А, извините, я забыл, что он не XML-based Спасибо!
Bobo
Уже с Приветом
Posts: 518
Joined: 04 Jun 2002 01:40
Location: CA, USA

Post by Bobo »

blanko27 wrote:
Monoid wrote:Если речь идёт о WSDL то это не сериализация а генерция репрезентации этого метода в определёный формат, в данном, случае WSDL. А можно было бы например нагенерить тоже самое в IDL.
Имеется ли встроенная возможность в .NET програмно генерировать IDL? А, извините, я забыл, что он не XML-based Спасибо!


Можно сгенерить tlb:
Tlbexp.exe или System.Runtime.InteropServices.TypelibConverter.
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Bobo wrote:Можно сгенерить tlb:
Tlbexp.exe или System.Runtime.InteropServices.TypelibConverter.
Нет, tlb - не подойдет. Важно преобразование в читаемую форму (XML-based), чтобы можно было поправить вручную и без компиляции, on-the -fly, так сказать.
Bobo
Уже с Приветом
Posts: 518
Joined: 04 Jun 2002 01:40
Location: CA, USA

Post by Bobo »

blanko27 wrote:В двух словах - мне нужна определенная кастомизация аппликации, не известно заранее с каким типом данных я буду работать. Начальники у меня напористые ребята - хотят .NET и XML для описания интерфейса типов.


A, я понял вашу проблему... Мне скоро придется решать примерно такую же.
То есть реализовывать plugins, не имеющие обшего интерфейса.
Я склоняюсь к следующим вариантам:
1. описывать интерфейсы на C# и компилить их на лету
2. отказаться от strongly typed интерфейсов, пусть они принимают/возвращают XML (который можно описать cxемой)
3. тоже, что 2, но передавать не XML, а об'екты типа "message", т.е. что-нибудь типа NameValueCollection[], тогда "cxема" получается "линейной", и ее легко описать в БД.
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Bobo wrote:A, я понял вашу проблему... Мне скоро придется решать примерно такую же.
То есть реализовывать plugins, не имеющие обшего интерфейса.
Да, можно описать эту задачу именно так - с точки зрения плагинов, интерфейс которых заранее не определен. В описании интерфейса в моей задаче важно использовать XML и, по-возможности, встроенные средства .NET. Спасибо! :)
blanko27
Уже с Приветом
Posts: 2264
Joined: 17 Jun 2003 04:41
Location: Just like US

Post by blanko27 »

Bobo wrote:Я склоняюсь к следующим вариантам...
Да, ИМХО все эти варианты будут работать.

Return to “Вопросы и новости IT”