Сериализация Пар имя/значение в Пользовательском объекте через веб-сервис

$('a.policyBreach').bind('click mouseover', function (e) {
if (event.type === "mouseover") {
if($(this).hasClass("thumbs-up")) {
  // handle the value for thumbs-up
} else {
  // handle the value for thumbs-up
}
// Need to Store differnt values for icons for Thumbs UP, and Thumbs Down respectively. 

} else if (event.type === "click") {
blockStatus=1;
$(this).closest('tr').find('input:checkbox').prop('checked', !0);
$('.overLayDiv').addClass('active');
$('.disableBlock').addClass('no-active');
$("#duplicateExpense").css('display','none');
$('#policyViolation').css('display','block');
$('#policyViolation').css('width','100%');
$('#policyViolation #btnRejectPayment-PV').css('display','none');
$('#policyViolation #closeRightSlider').css('display','block');
$('.rightSliderBg2').css('width','50%').addClass('active');
}
});
7
задан Community 23 May 2017 в 12:01
поделиться

5 ответов

Это похоже на динамические свойства для объекта. C# является не совсем динамическим языком в отличие от JavaScript, или возможно PHP может проанализировать свойства объектов на лету. Следующие два метода - то, о чем я могу думать. Второй мог бы вписаться в Ваши требования.

KISS путь

Содержание Это Простой Глупый путь

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List<string> OtherInfo { get; set; }  
}

У Вас могут быть пары значение-имя, который разделяется '|'

OtherInfo = {"Hobbies|Programming", "Website|Stackoverflow.com"}

Сериализированные формы

<StorageObject>
    <Name>Matthew</Name>
    <Birthday>Jan 1st, 2008</Birthday>
    <OtherInfo>
        <string>Hobbies|Programming</string>
        <string>Website|Stackoverflow.com</string>
    </OtherInfo>
</StorageObject>

Динамический путь в C#

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

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public XElement OtherInfo { get; set; } // XmlElement for dot net 2
}

Можно легко создать объект OtherInfo как центральный элемент, например.

XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..Hobbies xelement & text value..);
OtherInfo.Add( ..WebSite xelement & text value..);

Сериализированная форма будет

<OtherInfo>
    <Hobbies>Programming</Hobbies>
    <Website>Stackoverflow.com</Website>
</OtherInfo>

или создайте его как центральный атрибут

XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..nvp xattribute Hobbies & value..);
OtherInfo.Add( ..nvp xattribute WebSite & value..);

<OtherInfo>
    <nvp n="Hobbies" v="Programming" />
    <nvp n="Website" v="Stackoverflow.com" />
</OtherInfo>

Для любого динамического языка это может получить доступ к свойствам непосредственно. Для остальных они могут получить доступ к значению чтением XML. Чтение XML хорошо поддерживается большей частью платформы.

5
ответ дан 7 December 2019 в 03:22
поделиться

Взгляните в Систему. Xml. Сериализация. Атрибут XmlSerializerAssemblyAttribute. Это позволяет Вам указать пользовательский сериализатор уровня класса. Вы сможете выложить безотносительно XML Вам нравится.

Быстрый способ набрать скорость на них состоит в том, чтобы использовать sgen.exe, чтобы генерировать один и посмотреть на него с Отражателем.

- Oisin

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

Я не уверен, что это решило бы Вашу проблему (она будет в C#, но возможно не в PHP), но попытайтесь использовать Dictionary<string,List<string>> OtherInfo вместо List<NameValuePairs>. Затем "Хобби" и "Веб-сайты" были бы Вашими ключами, и значения будут списком хобби или веб-сайтов. Я не уверен, как это сериализировало бы, все же.

Вы смогли бы сослаться на списки хобби как:

List<string> hobbies = storageObject.OtherInfo["Hobbies"];

[РЕДАКТИРОВАНИЕ] Видит здесь для универсального сериализуемого словаря XML. Этот производный класс является тем, который необходимо было бы использовать вместо универсального Словаря.

-1
ответ дан 7 December 2019 в 03:22
поделиться

Это - то, на чем я обосновался.

Структура класса:

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  [XmlAnyElement("Info")]  // this prevents double-nodes in the XML
  public XElement OtherInfo { get; set; }
}

Использование:

StorageObject o = new StorageObject();
o.OtherInfo.Add(new XElement("Hobbies","Programming");
o.OtherInfo.Add(new XElement("Website","Stackoverflow.com");

Вывод:

<Info>
  <Hobbies>Programming</Hobbies>
  <Website>Stackoverflow.com</Website>
</Info>

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

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

Как совершенно другое взятие на этом, почему бы не думать о выполнении его полностью по-другому. Имейте один метод веб-сервиса для возврата сериализированного объекта хранения, минус OtherInfo и другой метод для возврата списка свойств (ключи) для OtherInfo, и одна треть для возврата списка значений для любого ключа. Предоставленный, это предпримет более путешествия в прямом и обратном направлениях в веб-сервис, если Вы захотите все данные, но решение будет намного более простым и более гибким.

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }

  [Nonserializable]
  public Dictionary<string,List<string>> OtherInfo { get; set; }  
}

[WebMethod]
public List<StorageObject> GetStorageObjects() {
    // returns list of storage objects from persistent storage or cache
}

[WebMethod]
public List<string> GetStorageObjectAttributes( string name )
{
    // find storage object, sObj
    return sObj.Keys.ToList();
}

[WebMethod]
public List<string> GetStorageObjectAtributeValues( sting name, string attribute )
{
    // find storage object, sObj
    return sObj[attribute];
}
1
ответ дан 7 December 2019 в 03:22
поделиться
Другие вопросы по тегам:

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