Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запретить сериализацию свойства / 15 сообщений из 15, страница 1 из 1
22.02.2013, 13:14
    #38162146
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Имею класс:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Partial Public Class tblCurrency
    Public Property CurrencyID As Integer
    Public Property Name As String
    Public Property ShortName As String
    Public Property Code As String

    Public Overridable Property tblPrice As ICollection(Of tblPrice) = New HashSet(Of tblPrice)
End Class

Попытка сделать New XmlSerializer(GetType(tblCurrency)) оканчивается ошибкой из-за того, что ICollection является интерфейсом.
Пытаюсь сделать так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Class tblCurrencyImport
    Inherits tblCurrency

    <System.Xml.Serialization.XmlIgnore> _
    Public Overrides Property tblPrice As ICollection(Of tblPrice)
        Get
            Return MyBase.tblPrice
        End Get
        Set(value As ICollection(Of tblPrice))
            MyBase.tblPrice = value
        End Set
    End Property
End Class

Dim serializer As New XmlSerializer(GetType(tblCurrencyImport))

Получаю ту же ошибку.

Можно ли как-нибудь еще заставить XmlSerializer проигнорировать это свойство, не трогая класс tblCurrency (он сгенерирован EF)?
А если нет, может есть альтернатива десериализации через XmlSerializer.Deserialize?
...
Рейтинг: 0 / 0
22.02.2013, 14:05
    #38162256
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Antonariy,

ошибка на этапе компиляции?
...
Рейтинг: 0 / 0
22.02.2013, 14:26
    #38162296
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Нет, на этапе выполнения.
...
Рейтинг: 0 / 0
22.02.2013, 14:28
    #38162300
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
AntonariyНет, на этапе выполнения.

какой эксепшн?
...
Рейтинг: 0 / 0
22.02.2013, 14:33
    #38162312
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
System.NotSupportedException

Невозможно сериализовать член Test.tblCurrency.tblPrice типа System.Collections.Generic.ICollection`1[[Test.tblPrice, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], т.к. он является интерфейсом.
...
Рейтинг: 0 / 0
22.02.2013, 14:41
    #38162329
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Попробовал добавить XmlIgnore в tblCurrency, сработало. Но это не то решение, tblCurrency изменять нельзя.
...
Рейтинг: 0 / 0
22.02.2013, 14:42
    #38162331
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Antonariy,

а почему вы атрибут не вешаете в базовом классе?
...
Рейтинг: 0 / 0
22.02.2013, 14:44
    #38162336
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
AntonariyПопробовал добавить XmlIgnore в tblCurrency, сработало.
опаздал
AntonariytblCurrency изменять нельзя.
тогда не наследуйся от него
...
Рейтинг: 0 / 0
22.02.2013, 14:48
    #38162343
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
...
Рейтинг: 0 / 0
22.02.2013, 15:00
    #38162358
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Тогда что делать-то?

Мне нужно десериализовать xml в объект именно класса tblCurrency и именно с этого началась засада. Я надеялся, что наложение атрибута на overridable-свойство наследника прикроет его от XmlSerializer'а, но не взлетело.

Есть еще такая штука как DataContractSerializer, может она сработает? Как ее применить?
...
Рейтинг: 0 / 0
22.02.2013, 15:15
    #38162398
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
pationAntonariy,

смотрим на overrides Посмотрел, не понял, как это применить в моей ситуации.
...
Рейтинг: 0 / 0
22.02.2013, 15:47
    #38162451
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
DataContractSerializer спасает, ему наплевать на интерфейсы, но в xml необходим определенный неймспейс с названием приложения:

Код: vbnet
1.
2.
3.
4.
5.
        Dim s As String = "<tblCurrency xmlns='http://schemas.datacontract.org/2004/07/Test'><CurrencyID>4</CurrencyID><Name>Шекели</Name></tblCurrency>"
        Dim st As Stream = New MemoryStream(Encoding.UTF8.GetBytes(s))

        Dim ser As New DataContractSerializer(GetType(tblCurrency))
        Dim c As tblCurrency = ser.ReadObject(st)
...
Рейтинг: 0 / 0
22.02.2013, 16:12
    #38162491
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Лично я предпочитаю не подвергать сериализации доменные объекты, а конвертировать их в объекты под это заточенные.
В одном месте нужно сериализовать в XML, в другом в JSON, в третьем сохранить как BSON, и т.п.
...
Рейтинг: 0 / 0
22.02.2013, 16:19
    #38162505
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
Antonariy,

вы этот же атрибут XmlIgnore добавляете вручную.
...
Рейтинг: 0 / 0
22.02.2013, 18:42
    #38162709
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запретить сериализацию свойства
skyANAЛично я предпочитаю не подвергать сериализации доменные объекты, а конвертировать их в объекты под это заточенные.Фишка в том, что этот объект не был доменным во время сериализации. Это xml, который я получаю от определенного веб-сервиса, не имеющего wsdl. C помощью xsl я превращаю его в вид, соответствующий доменному, и после десериализации остается лишь сделать add/update.

Однако все запросы и ответы этого сервиса описаны xsd-схемами, которыми можно не только данные валидировать, но и нагенерить из них классов, которые и есть те самые заточенные. Но их придется допиливать вручную: некоторые классы в разных схемах повторяются частично или полностью, ну и маппинг полей как-то придется делать. Обрывки единого логического узла начинают расползаться по модулям проекта как тараканы :) Либо превращаться в лапшеобразную длинноту. Поэтому лучше собрать большую ее часть в одном xsl-файле, ящетаю.

Но я тем не менее щетаю, что обратную задачу, отправку xml веб-сервису, лучше таки решать через спецобъекты.

netivanвы этот же атрибут XmlIgnore добавляете вручную.Да всё хорошо уже, ничего никуда больше не добавляю.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запретить сериализацию свойства / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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