Это очень сложный вопрос о том, как сериализовать данные с помощью вызова веб-службы, когда данные не строго типизированы. Я постараюсь выложить это как можно лучше.
Объект хранения образцов:
[Serializable]
public class StorageObject {
public string Name { get; set; }
public string Birthday { get; set; }
public List<NameValuePairs> OtherInfo { get; set; }
}
[Serializable]
public class NameValuePairs {
public string Name { get; set; }
public string Value { get; set; }
}
Образец использования:
[WebMethod]
public List<StorageObject> GetStorageObjects() {
List<StorageObject> o = new List<StorageObject>() {
new StorageObject() {
Name = "Matthew",
Birthday = "Jan 1st, 2008",
OtherInfo = new List<NameValuePairs>() {
new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
}
},
new StorageObject() {
Name = "Joe",
Birthday = "Jan 10th, 2008",
OtherInfo = new List<NameValuePairs>() {
new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
}
}
};
return o;
}
Возвращаемое значение из веб-службы:
<StorageObject>
<Name>Matthew</Name>
<Birthday>Jan 1st, 2008</Birthday>
<OtherInfo>
<NameValuePairs>
<Name>Hobbies</Name>
<Value>Programming</Value>
</NameValuePairs>
<NameValuePairs>
<Name>Website</Name>
<Value>Stackoverflow.com</Value>
</NameValuePairs>
</OtherInfo>
</StorageObject>
Что я хочу:
<OtherInfo>
<Hobbies>Programming</Hobbies>
<Website>Stackoverflow.com</Website>
</OtherInfo>
Причина и прочее:
Во-первых, я извиняюсь за длину поста, но я также хотел дать воспроизводимый код.
Я хочу это в этом формате, потому что я использую веб-сервисы из PHP. Я хочу легко пойти:
// ЭТО ВАЖНО
In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".
Если бы он был в другом формате, то у меня не было бы возможности сделать это вообще. Кроме того, в C #, если я использую службу, я также хотел бы сделать следующее:
// ЭТО ВАЖНО
In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];
К сожалению, я не уверен, как этого добиться. Я смог получить это таким образом, создав собственный словарь, в котором реализован IXmlSerializer (см. StackOverflow: словарь IXmlSerializer ), однако он взорвал схему WSDL из воды. Это также слишком сложно и дало ужасные результаты в моем приложении WinFormsTester!
Есть ли способ сделать это? Какой тип объектов мне нужно создать? Есть ли способ сделать это / кроме создания строго типизированной коллекции /? Очевидно, что если я сделаю это строго напечатано так:
public class OtherInfo {
public string Hobbies { get; set; }
public string FavoriteWebsite { get; set; }
}
Тогда это будет работать отлично, у меня не будет проблем с WSDL, я смогу легко получить к нему доступ из PHP и C # (.OtherInfo.Hobbies).
Однако я бы полностью потерял смысл NVP, потому что мне нужно было бы заранее знать, что это за список, и он был бы неизменным ... скажем, из базы данных.
Спасибо всем !! Я надеюсь, что мы сможем найти какое-то решение для этого. Вот требования снова:
- Схема WSDL не должна ломаться
- Пары имя-значение (NVP) должны быть сериализованы в формат атрибута
- Должно быть легко получить доступ к NVP в PHP по имени ["Хобби"]
- Должен быть легкодоступным в C # (и быть совместимым с генератором прокси)
- Быть легко сериализуемым
- Не требуется, чтобы я строго печатал данные
Теперь я / полностью / открыт для ввода лучшего / другого способа сделать это. Я храню некоторую относительно «статическую» информацию (например, Имя) и кучу данных. Если есть лучший способ, я бы с удовольствием его услышал.