Дженерики и вводящий утку XML в.NET?

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

Рассмотрите следующее:

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

xmlObject.SomePropertyDefinedInTheXML = SomeFunction()

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

7
задан Achilles 12 February 2010 в 17:52
поделиться

4 ответа

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

Я ожидаю сохранить lat/lon для каждого элемента в моей БД (так что он геокодируется только один раз). Чтобы выбрать элементы в пределах определенного расстояния от точки, я рассчитаю lat/lon числа, которые 'x' миль к северу/юго/восток/запад от моей центральной точки. Затем выбор становится простым делом подбора записей, где значения lat/lon попадают между значениями моего квадрата.

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

Я не знаком с лицензией Bing, но если я правильно помню о google, вы должны иметь платную (коммерческую) лицензию для хранения результатов геокодирования. И это недешево. Таким образом, это может свести на нет любую ценность моего предложения: (

Edit; Я просто прочитал вопрос немного внимательнее, и я вижу, что речь идет о проезде миль, а не линейных миль. Так что мой ответ на самом деле неприменим, если только вы не хотите использовать его как способ сократить количество расчетов расстояния вождения, которые вы должны сделать.

Кроме того, на тему геокодирования и лицензий, вы можете посмотреть на geocoder.us , что довольно дешево.

-121--4076896-

Я думаю, что у вас есть несколько вариантов. Я предполагаю, что мы говорим о длительных рабочих местах, иначе я просто объединю их как одно задание монстра (несколько шагов построения в одном задании) и создам отдельные рабочие места для их индивидуального запуска.

Как уже упоминалось, для длительных заданий посмотрите на подключаемый модуль . Как правило, к вашему сведению имеется страница, объясняющая, почему вы хотите отделить задания тестирования от заданий здания. См. здесь .

-121--4903795-

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
ответ дан 7 December 2019 в 01:20
поделиться

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

4
ответ дан 7 December 2019 в 01:20
поделиться

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

Если вы пойдете по пути этих видов хотя, и освобождения типов, вы будете иметь: классические фреймворки => фреймворки прототипирования => утиная типизация.

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

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

Если это во что бы то ни стало необходимо, у вас есть два пути (с участием рефлексии):

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

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

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

Удачи вам

0
ответ дан 7 December 2019 в 01:20
поделиться

Если вы контролируете определение 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:
<Книга
<Имя>AB
//You can then [Deserialize][2] it back again with:
var book = DataContractDeserializer.Instance.Parse<Book>(xml);

Вот ссылки на классы Serializer и Deserializer.

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

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

3
ответ дан 7 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: