SOAP: как десериализовать из строки (C#)?
От: Domnitch  
Дата: 13.10.15 14:36
Оценка:
C#, VS 2012, .NET 4.5+

Моя программа получает строки, являющиеся сериализацией объектов некоего класса в SOAP. Самого этого класса у меня нет.
<SOAP-ENV:Envelope xmlns:xsi="..........">
<SOAP-ENV:Body>
<a1:DeviceServer_x002B_Details id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SecretName1.SecretName2.CommonLibrary.Classes/CommonLibrary%2C%20Version%3D2.7.5753.35231%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<host id="ref-3">Domnitch</host>
<port>50116</port>
<protocol>tcp</protocol>
<deviceTypeEnum>Quest</deviceTypeEnum>
<timePeriod_Normal>2000</timePeriod_Normal>
<timePeriod_Resend>1000</timePeriod_Resend>
<timePeriod_Disconnect>5000</timePeriod_Disconnect>
<resendCount>2</resendCount>
</a1:DeviceServer_x002B_Details>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Очень хочется извлечь данные из строки в некий самодельный класс примерно так:

public class MyClass
{
        public class Details
        {
            [SoapElement("host")]
            public string Host { get; set; }
 
            [SoapElement("port")]
            public int Port { get; set; }
        }
 
       public Details GetDetail(string s)
            {
                var formatter = new SoapFormatter();
                var reader = new MemoryStream(Encoding.Unicode.GetBytes(value));
                var detail = (Details)formatter.Deserialize(reader);
                reader.Close();
                return detail;
            }
}
Не получается — при исполнении SOAP заявляет, что не знает сборки SecretName1.SecretName2.CommonLibrary.Classes... и так далее.
Взять эту сборку мне неоткуда, создавать ее самому крайне громоздко.
Нет ли какого средства — задать какие-то атрибуты к примеру?
Re: SOAP: как десериализовать из строки (C#)?
От: Mihas  
Дата: 13.10.15 15:02
Оценка:
Здравствуйте, Domnitch, Вы писали:

D>Нет ли какого средства — задать какие-то атрибуты к примеру?

Почитай про xsd.exe.
Входит в состав студии. Умеет по XSD построить классы для десериализации XML. Может быть, и по XML (если в наличии нет XSD) сможет — не знаю.
Re[2]: SOAP: как десериализовать из строки (C#)?
От: Ватакуси Россия  
Дата: 13.10.15 16:59
Оценка:
D>>Нет ли какого средства — задать какие-то атрибуты к примеру?
M>Почитай про xsd.exe.
M>Входит в состав студии. Умеет по XSD построить классы для десериализации XML. Может быть, и по XML (если в наличии нет XSD) сможет — не знаю.

Или wsdl.exe — но для него лучше иметь полноценный SOAP service (или хотя бы файл декларации)
Все будет Украина!
Re[2]: SOAP: как десериализовать из строки (C#)?
От: koodeer  
Дата: 14.10.15 00:22
Оценка:
Здравствуйте, Mihas, Вы писали:

M>Почитай про xsd.exe.

M>Входит в состав студии. Умеет по XSD построить классы для десериализации XML. Может быть, и по XML (если в наличии нет XSD) сможет — не знаю.

Поддерживаю.
Да, xsd.exe может генерировать классы по xml, даже без схемы.

Более того, можно поступить проще: копируем xml в клипборд, жмём в ВизуалСтудии Edit > Paste Special > Paste XML as Classes. Если xml валидный, код будет сгенерирован и вставлен на лету.
Re[3]: SOAP: как десериализовать из строки (C#)?
От: Domnitch  
Дата: 14.10.15 17:46
Оценка:
Я использовал Paste Special... и получил работающий класс.
После двух часов работы Resharper'ом класс стал еще и читабельным

Большое спасибо, koodeer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.