Как в .NET преобразовать тип (класс) в XSD схему?
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
Как в .NET преобразовать тип (класс) в XSD схему?
Есть утилита xsd.ехе и примеры таких преобразований, но преобразование получается неоднозначное. Почему-то не преобразуются методы класса и некоторые атрибуты (например ReadOnly или DefaultValue). Имеются ли какие-то стандартные функции для однозначного преобразования? (Например создать свой CodeNamespace и экспортировать его в XmlSchema, или что-то типа этого?)
Спасибо!
Спасибо!
-
- Уже с Приветом
- Posts: 932
- Joined: 18 Mar 2000 10:01
- Location: Seattle
А разве schema поддерживает методы? По-моему, это просто способ описывать допустимый формат xml-документов, а не язык программирования. Поэтому нетривиальные ограничения на элементы xml-документа в рамках xsd schema описать нельзя, и тогда бывает нужно дополнительную валидацию делать руками. Default values, впрочем, XSD поддерживает.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
-
- Уже с Приветом
- Posts: 932
- Joined: 18 Mar 2000 10:01
- Location: Seattle
blanko27 wrote:А это не важно, главное - что она поддерживает типы. Опишите интерфеис метода каким-либо типом - и все ОК. Проблема в том, что я не вижу этой возможности built-in так-сказать.Okie wrote:А разве schema поддерживает методы?
Ну в таком случае это звучит похоже на 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 файлы в этом проекте.
-
- Уже с Приветом
- Posts: 1346
- Joined: 22 Sep 2001 09:01
- Location: Dallas TX, USA
Re: Как в .NET преобразовать тип (класс) в XSD схему?
Я так понимаю Вам нужно сериализовать-десериалиазовать класс.
Опишите задачу на более высоком уровне, пожалуйста.
Вам нужен:
Удаленный доступ к обьекту (методам объекта)?
Копирование обьекта в другой AppDomain?
Сохранине состояния обьекта на диске (в форме XML) с последующим восстановлением?
Опишите задачу на более высоком уровне, пожалуйста.
Вам нужен:
Удаленный доступ к обьекту (методам объекта)?
Копирование обьекта в другой AppDomain?
Сохранине состояния обьекта на диске (в форме XML) с последующим восстановлением?
Last edited by Volant on 23 Dec 2003 00:50, edited 1 time in total.
-
- Новичок
- Posts: 66
- Joined: 31 Jul 2003 14:14
- Location: SPb->USA
Я не совсем поняла, чего сделать-то надо.
Если вопрос по схеме то вам сюда http://www.w3.org/XML/Schema
А если по ютилите, то опишите, плиз, задачу. Оч. интересно.
Если вопрос по схеме то вам сюда http://www.w3.org/XML/Schema
А если по ютилите, то опишите, плиз, задачу. Оч. интересно.
Единственно, что может спасти смертельно раненного кота, -- это глоток бензина...
-
- Уже с Приветом
- Posts: 1346
- Joined: 22 Sep 2001 09:01
- Location: Dallas TX, USA
-
- Уже с Приветом
- Posts: 207
- Joined: 09 Sep 2001 09:01
- Location: Seattle, WA
.Net генерирует SOAP spec (или как она там называется) для web services вполне автоматически. Попробуйте создать web service project и потом посмотрите на auto generated файлы в этом проекте.
Ваша xsd базируется на xml, который вы создаете из .Net типа, а не напрямую на .Net типе. Поэтому все зависит от того как вы сериализуете свой тип (если в SOAP, то для него есть свой xsd).
Попробуйте сериализовать свой тип в xml, используя [Serializable] и другие аттрибуты, а затем создать из полученного xml схему в Visual Studio.
-
- Posts: 12
- Joined: 29 Aug 2003 15:22
- Location: NJ, USA
-
- Уже с Приветом
- Posts: 932
- Joined: 18 Mar 2000 10:01
- Location: Seattle
-
- Новичок
- Posts: 66
- Joined: 31 Jul 2003 14:14
- Location: SPb->USA
-
- Уже с Приветом
- Posts: 518
- Joined: 04 Jun 2002 01:40
- Location: CA, USA
Никакой serializer или formatter описывать тип не будет.
Serialization - это описание state of an instance.
Описанием типов занимается WSDL (как справедливо заметил Okie).
Это реализовано в классе System.Runtime.Remoting.MetadataServices.Metadata а также в утилите soapsuds.exe.
Альтернатива - реализовать ручками: пройтись по reflection и выплюнуть описания мемберов в cxему. Это просто, я писал свой сериализер примерно таким способом. Только здесь, в отличие от сериализера, не совсем ясно, как сделать обратное преобразование - создать тип по описанию. Единственная идея - сгенерить source code.
Еще есть такая вешь как CodeDOM, которая может здесь помочь, но я с ней не разбирался.
Присоединяюсь к вопросу "зачем это нужно?"
Serialization - это описание state of an instance.
Описанием типов занимается WSDL (как справедливо заметил Okie).
Это реализовано в классе System.Runtime.Remoting.MetadataServices.Metadata а также в утилите soapsuds.exe.
Альтернатива - реализовать ручками: пройтись по reflection и выплюнуть описания мемберов в cxему. Это просто, я писал свой сериализер примерно таким способом. Только здесь, в отличие от сериализера, не совсем ясно, как сделать обратное преобразование - создать тип по описанию. Единственная идея - сгенерить source code.
Еще есть такая вешь как CodeDOM, которая может здесь помочь, но я с ней не разбирался.
Присоединяюсь к вопросу "зачем это нужно?"
-
- Posts: 12
- Joined: 29 Aug 2003 15:22
- Location: NJ, USA
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.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
Спасибо огромное всем ответившим, я не сразу добрался до своего компьютера, а с работы ответить не было возможности.
В двух словах - мне нужна определенная кастомизация аппликации, не известно заранее с каким типом данных я буду работать. Начальники у меня напористые ребята - хотят .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 нет, интересуют именно вопросы сериализации.
В двух словах - мне нужна определенная кастомизация аппликации, не известно заранее с каким типом данных я буду работать. Начальники у меня напористые ребята - хотят .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 нет, интересуют именно вопросы сериализации.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
Примерно так, согласно Don Box-у:Monoid wrote:...Например, есть клас с методом: void Foo( int a ); Что понимать под сериализацией signature такого метода?...
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>
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
Имеется ли встроенная возможность в .NET програмно генерировать IDL? А, извините, я забыл, что он не XML-based Спасибо!Monoid wrote:Если речь идёт о WSDL то это не сериализация а генерция репрезентации этого метода в определёный формат, в данном, случае WSDL. А можно было бы например нагенерить тоже самое в IDL.
-
- Уже с Приветом
- Posts: 518
- Joined: 04 Jun 2002 01:40
- Location: CA, USA
blanko27 wrote:Имеется ли встроенная возможность в .NET програмно генерировать IDL? А, извините, я забыл, что он не XML-based Спасибо!Monoid wrote:Если речь идёт о WSDL то это не сериализация а генерция репрезентации этого метода в определёный формат, в данном, случае WSDL. А можно было бы например нагенерить тоже самое в IDL.
Можно сгенерить tlb:
Tlbexp.exe или System.Runtime.InteropServices.TypelibConverter.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
-
- Уже с Приветом
- Posts: 518
- Joined: 04 Jun 2002 01:40
- Location: CA, USA
blanko27 wrote:В двух словах - мне нужна определенная кастомизация аппликации, не известно заранее с каким типом данных я буду работать. Начальники у меня напористые ребята - хотят .NET и XML для описания интерфейса типов.
A, я понял вашу проблему... Мне скоро придется решать примерно такую же.
То есть реализовывать plugins, не имеющие обшего интерфейса.
Я склоняюсь к следующим вариантам:
1. описывать интерфейсы на C# и компилить их на лету
2. отказаться от strongly typed интерфейсов, пусть они принимают/возвращают XML (который можно описать cxемой)
3. тоже, что 2, но передавать не XML, а об'екты типа "message", т.е. что-нибудь типа NameValueCollection[], тогда "cxема" получается "линейной", и ее легко описать в БД.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US
Да, можно описать эту задачу именно так - с точки зрения плагинов, интерфейс которых заранее не определен. В описании интерфейса в моей задаче важно использовать XML и, по-возможности, встроенные средства .NET. Спасибо!Bobo wrote:A, я понял вашу проблему... Мне скоро придется решать примерно такую же.
То есть реализовывать plugins, не имеющие обшего интерфейса.
-
- Уже с Приветом
- Posts: 2264
- Joined: 17 Jun 2003 04:41
- Location: Just like US