И снова сериализация
От: Аноним  
Дата: 23.10.08 14:17
Оценка:
Пытаюсь сериализировать такой класс:

[Serializable]
public class Test  
{
    private readonly int intValue;
    public int IntValue
    {
        get { return this.intValue; }
    }
    public Test(int intValue)
    {
        this.intValue = intValue;
    }
    public Test()
    {
    }
} 
private static string ObjectToXMLString<T>(T obj)
{
    var ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    var xws = new XmlWriterSettings
                            {
                                OmitXmlDeclaration = true,
                                NewLineHandling = NewLineHandling.Entitize,
                                Indent = false
                            };

    var writer = new XmlSerializer(typeof(T));

    var sb = new StringBuilder();
    using (var sw = new StringWriter(sb))
    {

        using (XmlWriter xw = XmlTextWriter.Create(sw, xws))
        {
            writer.Serialize(xw, obj, ns);
            return sb.ToString();

        }
    }
}


Где то в коде:
Test test = new Test(4711);
string xml_test = ObjectToXMLString(test);

Строка xml_test принимает вид: "<Test />", что в принципе логично: ни одного read-write свойства нет. Однако класс string это как то делает?

string str = "4712";
string xml_str = ObjectToXMLString(str);

строка xml_str равна "<string>4712</string>"

Хотелось бы узнать как. Интерфейс IXmlSerializable класс string вроде не поддерживает.
Куда копать уважаемые знатоки?
Re: И снова сериализация
От: Lloyd Россия  
Дата: 23.10.08 14:57
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Хотелось бы узнать как. Интерфейс IXmlSerializable класс string вроде не поддерживает.

А>Куда копать уважаемые знатоки?

Код для строки может быть тупо захардкожен.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: И снова сериализация
От: Аноним  
Дата: 23.10.08 15:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пытаюсь сериализировать такой класс:


А>
А>[Serializable]
А>public class Test  
А>{
А>    private readonly int intValue;
А>    public int IntValue
А>    {
А>        get { return this.intValue; }
А>    }
А>    public Test(int intValue)
А>    {
А>        this.intValue = intValue;
А>    }
А>    public Test()
А>    {
А>    }
А>} 
А>private static string ObjectToXMLString<T>(T obj)
А>{
А>    var ns = new XmlSerializerNamespaces();
А>    ns.Add("", "");

А>    var xws = new XmlWriterSettings
А>                            {
А>                                OmitXmlDeclaration = true,
А>                                NewLineHandling = NewLineHandling.Entitize,
А>                                Indent = false
А>                            };

А>    var writer = new XmlSerializer(typeof(T));

А>    var sb = new StringBuilder();
А>    using (var sw = new StringWriter(sb))
А>    {

А>        using (XmlWriter xw = XmlTextWriter.Create(sw, xws))
А>        {
А>            writer.Serialize(xw, obj, ns);
А>            return sb.ToString();

А>        }
А>    }
А>}
А>


А>Где то в коде:

А>
А>Test test = new Test(4711);
А>string xml_test = ObjectToXMLString(test);
А>

А>Строка xml_test принимает вид: "<Test />", что в принципе логично: ни одного read-write свойства нет. Однако класс string это как то делает?

А>
А>string str = "4712";
А>string xml_str = ObjectToXMLString(str);
А>

А>строка xml_str равна "<string>4712</string>"

А>Хотелось бы узнать как. Интерфейс IXmlSerializable класс string вроде не поддерживает.

А>Куда копать уважаемые знатоки?


может я что то не понял но почему бы в сущности которую надо сериализовать/десериализовать просто не добавить атрибуты
like this

[XmlAttribute]
public string Name;


и потом спокойно вызывать

 //Объект сериализации
 XmlSerializer ser = new XmlSerializer(obj.GetType());

 ser.Serialize(source, obj);


доп. инфо
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx
Re[2]: И снова сериализация
От: Аноним  
Дата: 23.10.08 15:53
Оценка:
И как быть?
Реализовать IXmlSerializable? Многовато таких классов, можно некоторые забыть. Кроме того есть еще и другие сериализаторы, к примеру бинарный
Да, блин, засада
Re[2]: И снова сериализация
От: Аноним  
Дата: 23.10.08 16:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>может я что то не понял но почему бы в сущности которую надо сериализовать/десериализовать просто не добавить атрибуты

А>like this

А>
А>[XmlAttribute]
А>public string Name;
А>


А>и потом спокойно вызывать


А>
А> //Объект сериализации
А> XmlSerializer ser = new XmlSerializer(obj.GetType());

А> ser.Serialize(source, obj);
А>


[Serializable]
public class Test  
{
    private readonly int intValue;
    public int IntValue
    {
        get { return this.intValue; }
    }
    public Test(int intValue)
    {
        this.intValue = intValue;
    }
    public Test()
    {
    }
}

Куда добавить
Re[3]: И снова сериализация
От: Воронков Василий Россия  
Дата: 23.10.08 16:55
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>
А>[Serializable]
А>public class Test  
А>{
А>    private readonly int intValue;
А>    public int IntValue
А>    {
А>        get { return this.intValue; }
А>    }
А>    public Test(int intValue)
А>    {
А>        this.intValue = intValue;
А>    }
А>    public Test()
А>    {
А>    }
А>}
А>

А>Куда добавить

Сделать св-во IntValue доступным для записи, если дизайн позволяет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[4]: И снова сериализация
От: Kalina9001  
Дата: 23.10.08 18:51
Оценка:
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Сделать св-во IntValue доступным для записи, если дизайн позволяет.
Если бы это можно было сделать, то и начального вопроса не возникло бы
Re: И снова сериализация
От: Kalina9001  
Дата: 23.10.08 18:52
Оценка:
Здравствуйте, Аноним, Вы писали:
Это я был, забыл зарегестрироваться
Re: И снова сериализация
От: Pavel M. Россия  
Дата: 23.10.08 20:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хотелось бы узнать как. Интерфейс IXmlSerializable класс string вроде не поддерживает.

А>Куда копать уважаемые знатоки?

String и "=" переопределяет, а для нас он так просто недоступен. Вы же читали документацию к XmlSerializer, там же четкие требования:
1. Публичный конструктор
2. Read-write properties либо на них вешается XmlIgnore.

То есть либо Вы не тот инструмент используете, либо дизайн нарушен. как действовать далее зависит от того, что и как Вы делаете. Одно дело, если униврсальный сериализатор — десериализатор, другое если конкретный слоя для сохранения данных и восстановления и преобразования их в объекты, что-то вроде DAL. Тогда уж и дальше плясать.
--------------------------
less think — do more
Re: И снова сериализация
От: Аноним  
Дата: 24.10.08 02:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пытаюсь сериализировать такой класс:


Возможно ISerializationSurrogate (c Soap/Binary форматтером) или IDataContractSurrogate (с производными от XmlObjectSerializer) буду полезен пытающемуся?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.