Дженерики и типизированный XML в .NET? - PullRequest
7 голосов
/ 12 февраля 2010

Я работаю с некоторыми XML-представлениями экземпляров данных. Я десериализирую объекты, используя сериализацию .NET, но что-то в моей душе беспокоит необходимость писать классы для представления XML ... Ниже я хотел бы сделать то, что ЛЮБЛЮ, но не знаю, синтаксис ли это даже возможно:

Обратите внимание на следующее:

dim xmlObject = SomeXMLFunction() 'where some function returns an object/string representation of xml...

xmlObject.SomePropertyDefinedInTheXML = SomeFunction()

Какие-либо предложения по подходам с этим?

Ответы [ 4 ]

4 голосов
/ 12 февраля 2010

Иди и получи xsd.exe . Это создаст правильные классы сериализации XML из вашего определения схемы. Автоматически!

3 голосов
/ 15 февраля 2010

VB.NET позволяет работать с XML довольно интуитивно понятным способом:

Sub Serialize()
    Dim xml = <myData>
                  <someValue><%= someFunction() %></someValue>
              </myData>
    xml.Save("somefile.xml")
End Sub

Sub Serialize2()   ' if you get the XML skeleton as a string
    Dim xml = XDocument.Parse("<myData><someValue></someValue></myData>")
    xml.<myData>.<someValue>.Value = "test"
    xml.Save("somefile.xml")
End Sub

Sub Deserialize()
    Dim xml = XDocument.Load("somefile.xml")

    Dim value = xml.<myData>.<someValue>.Value
    ...
End Sub

Недостаток: у вас нет строгой печати; свойство Value всегда возвращает строку.

3 голосов
/ 12 февраля 2010

Если вы управляете определением XML (то есть XSD), тогда на самом деле хорошей идеей является написание классов, представляющих XML (они называются DTO). Он дает вам строго типизированный класс для кодирования, и вы получаете бесплатную десериализацию без необходимости выполнять ручной, подверженный ошибкам синтаксический анализ xml самостоятельно. Если это так, напишите сначала классы, например,

[DataContract]
public class Book
{
  [DataMember]
  public string Name {get;set;}

  [DataMember]
  public string Author {get;set;}
}
//Then you can use this code to serialize
var xml = DataContractSerializer.Instance.SerializeToString(
  new Book {Name="A", Artist="B"});

//which will give you something like:
<Book>
<Name>A</Name>
<Author>B</Author>
</Book>
//You can then [Deserialize][2] it back again with:
var book = DataContractDeserializer.Instance.Parse<Book>(xml);

Вот ссылки на классы Сериализатор и Десериализатор .

Если у вас есть WSDL или XSD, вы можете использовать wsdl.exe (или Добавить ссылку на службу в VS.NET) или xsd.exe, чтобы сгенерировать классы dto для вас, как предложено @DavidSchmitt.

В качестве альтернативы, если XSD недоступен, я рекомендую вам взглянуть на XLinq , чтобы найти другой простой способ анализа XML.

0 голосов
/ 12 февраля 2010

То, что вы спрашиваете при утечной печати, - это свободная типизация, а .net - это во всех случаях статическая типизация, по крайней мере, до версии 3.5.

если вы идете по пути такого рода и набираете тип освобождения: classical frameworks => prototyping frameworks => duck typing.

В js, очевидно, вы можете достичь почти всего этого, но в c # или vb.net вы окажетесь в классическом и бюрократическом отношении к типам.

Вы можете свободно создавать эти типы во время выполнения, но они занимают время обработки, и пока они не будут в памяти, они могут быть очень медленными.

Если это обязательно необходимо, у вас есть два пути (с отражением):

  • Вы можете создать те классы, которые, вероятно, будут владельцем свойства, используя информацию о свойствах, а затем создать тип и вставить в него. Вам нужно будет создать место для их размещения, например сборку или модуль. у вас будет мало поддержки или никакой поддержки от ваших нынешних методов, если вы не продумаете план действий для этого и не будете беспокоиться о проблемах безопасности, которые это может подразумевать.

  • Вы можете следовать по самому болезненному пути и использовать refle.emit, чтобы создать свой прямой путь в CLR, что может дать вам множество преимуществ. Хотя это может оказаться болезненным.

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

Удачи вам

...