Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Xml-сериализация / 8 сообщений из 8, страница 1 из 1
30.12.2015, 11:20
    #39140521
Maksym_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
С наступающим!

Пришлось, столкнуться с сериализацией в Xml. То-ли туплю, то-ли новый год уже действует.

Смысл следующий:
Язык - Visual Basic .net
Среда - VS2008 (под framework 3.5)

Нужно реализовать взаимодействие с платежной системой по средствам протокола ОСМП 4.0

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<request> 
    <protocol-version>4.00</protocol-version> 
    <request-type>10</request-type> 
    <terminal-id>123</terminal-id> 
    <extra name="login">login</extra> 
    <extra name="password-md5">password-md5</extra> 
    <extra name="client-software">Dealer v3.22</extra>
    ...
<request>



С <request>,<protocol-version>,<request-type>,<terminal-id> все просто, но чет потом начинаются трудности.

(Честно, с какой целью, было засовывать идентификатор поля в значение атрибута тега, в упор не пойму. Первые 3 тега нормальные, потом пошел откровенный бред. Видать на 4-ом разработчики решили бухнуть. Другого объяснения у меня нет этому танцу с бубнами)

Код: xml
1.
2.
3.
<extra name="login">login</extra> 
<extra name="password-md5">password-md5</extra> 
<extra name="client-software">Dealer v3.22</extra>



Возможно ли как-то реализовать класс, чтобы можно было его потом в это сериализовать? Если да то как?
...
Рейтинг: 0 / 0
30.12.2015, 13:03
    #39140595
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
Это не сериализация, это какой-то наколеночный экспорт данных. К сожалению, реализовывать прийдется также наколеночно

https://msdn.microsoft.com/en-us/library/182eeyhh(v=vs.110).aspx
...
Рейтинг: 0 / 0
30.12.2015, 13:12
    #39140596
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
Maksym_tВозможно ли как-то реализовать класс, чтобы можно было его потом в это сериализовать? Если да то как?
Можете привести реализацию класса и код как Вы сериализуете сейчас?
...
Рейтинг: 0 / 0
30.12.2015, 13:16
    #39140600
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
zz118Это не сериализация, это какой-то наколеночный экспорт данных. К сожалению, реализовывать прийдется также наколеночно
трансформацией xslt можно сделать
...
Рейтинг: 0 / 0
30.12.2015, 13:32
    #39140621
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
<request> - в конце тег должен быть закрытым

Вот пример сериализации вашей XML, проверенный, всё 1 к 1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace ConsoleApplication30
{
    class Program
    {
        static void Main(string[] args)
        {
            SerializeSample();
            DeserializeSample();
            Console.ReadKey();
        }

        static void DeserializeSample()
        {
            const string xmlSample = @"<request> 
    <protocol-version>4.00</protocol-version> 
    <request-type>10</request-type> 
    <terminal-id>123</terminal-id> 
    <extra name=""login"">login</extra> 
    <extra name=""password-md5"">password-md5</extra> 
    <extra name=""client-software"">Dealer v3.22</extra>
</request>";
            var result = XmlSerializeHelper.Deserialize<Request>(xmlSample);
            Console.Write(result.ToString());
        } 

        static void SerializeSample()
        {
            var req = new Request
            {
                ProtocolVersion = "4.00",
                RequstType = 10,
                TerminalId = 123,
                Extras = new List<ExtraItem>
                {
                    new ExtraItem
                    {
                        Name = "login",
                        Value = "login"
                    },
                    new ExtraItem
                    {
                        Name = "password-md5",
                        Value = "password-md5"
                    },
                    new ExtraItem
                    {
                        Name = "client-software",
                        Value = "Dealer v3.22"
                    },
                }
            };
            var result = XmlSerializeHelper.Serialize(req, true);
            Console.Write(result);
        }
    }

    [XmlRoot("request")]
    public class Request
    {
        [XmlElement("protocol-version")]
        public string ProtocolVersion { set; get; }
        [XmlElement("request-type")]
        public int RequstType { set; get; }
        [XmlElement("terminal-id")]
        public int TerminalId { set; get; }
        [XmlElement("extra")]
        public List<ExtraItem> Extras { set; get; }
    }

    public class ExtraItem
    {
        [XmlAttribute("name")]
        public string Name { set; get; }
        [XmlText]
        public string Value { set; get; }
    }
}



это хелпер

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication30
{
    public static class XmlSerializeHelper
    {
        public class StringWriterUtf8 : StringWriter
        {
            public override Encoding Encoding
            {
                get
                {
                    return Encoding.UTF8;
                }
            }
        }
        
        public static string Serialize<T>(T value, bool emptyNs = false)
        {
            if (value.Equals(null)) return null;
            XmlSerializerNamespaces xmlNamespaces;
            if (!emptyNs)
            {
                xmlNamespaces = new XmlSerializerNamespaces();
                xmlNamespaces.Add("x", @"http://www.w3.org/2001/XMLSchema-instance");
            }
            else
            {
                xmlNamespaces = new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty});
            }

            var serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0];
            var settings = new XmlWriterSettings
            {
                Encoding = new UnicodeEncoding(false, false),
                Indent = true,
                IndentChars = "\t",
                NewLineChars= "\r\n",
                OmitXmlDeclaration = emptyNs
            };
            using (var textWriter = new StringWriterUtf8())
            {
                using (var xmlWriter = XmlWriter.Create(textWriter, settings))
                {
                    serializer.Serialize(xmlWriter, value, xmlNamespaces);
                }
                return textWriter.ToString();
            }
        }

        public static T Deserialize<T>(string xml)
        {

            if (string.IsNullOrEmpty(xml))
            {
                return default(T);
            }

            var serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; 

            var settings = new XmlReaderSettings();

            using (var textReader = new StringReader(xml))
            {
                using (var xmlReader = XmlReader.Create(textReader, settings))
                {
                    return (T)serializer.Deserialize(xmlReader);
                }
            }
        }

        public static T Deserialize<T>(XmlReader xmlReader)
        {
            var serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0];
            return (T)serializer.Deserialize(xmlReader);
        }
    }
}
...
Рейтинг: 0 / 0
30.12.2015, 14:21
    #39140656
Maksym_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
Roman Mejtes,
Ой, спасибо большое... все работает!
Туплю не иначе... =))))
...
Рейтинг: 0 / 0
30.12.2015, 14:52
    #39140683
dma_caviar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
Maksym_t,

киви штоли?
...
Рейтинг: 0 / 0
30.12.2015, 15:35
    #39140704
Maksym_t
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xml-сериализация
dma_caviar,
Вроде оно, сервер не у меня. У организации с которой у нас договор на прием платежей.
Кинули мне ссылку на описание протокола ОСМП.
Пишу интерфейс под работу с их сервером.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Xml-сериализация / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]