powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Запретить сериализацию свойства
15 сообщений из 15, страница 1 из 1
Запретить сериализацию свойства
    #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
Запретить сериализацию свойства
    #38162256
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

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

какой эксепшн?
...
Рейтинг: 0 / 0
Запретить сериализацию свойства
    #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
Запретить сериализацию свойства
    #38162329
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал добавить XmlIgnore в tblCurrency, сработало. Но это не то решение, tblCurrency изменять нельзя.
...
Рейтинг: 0 / 0
Запретить сериализацию свойства
    #38162331
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

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

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

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

смотрим на overrides Посмотрел, не понял, как это применить в моей ситуации.
...
Рейтинг: 0 / 0
Запретить сериализацию свойства
    #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
Запретить сериализацию свойства
    #38162491
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я предпочитаю не подвергать сериализации доменные объекты, а конвертировать их в объекты под это заточенные.
В одном месте нужно сериализовать в XML, в другом в JSON, в третьем сохранить как BSON, и т.п.
...
Рейтинг: 0 / 0
Запретить сериализацию свойства
    #38162505
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

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

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

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

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


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