Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > ASP.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2019, 10:20   #1
Sasha811
Пользователь
 
Регистрация: 20.12.2008
Сообщений: 22
По умолчанию Cериализация объекта с свойством {get;}

Уважаемые специалисты,
Вопрос такой:
не получается сереализовать свойство {get;} - то есть без сеттера. То есть объект сериализуеться, но если дернуть в браузере соответственный контроллер и метод Get, то браузер загрузит объект только со свойствами {get;set;}. Есть ли решение такой проблемы, - думаю оно касается больше сериализиции/десериализации чем Web APi. Самый простой способ, сделать все с сеттером, но тогда я нарушу свои сущности, и они будут из себя представлять не то, что должны на самом деле. Еще где то вычитал способ, что для сериализации можно сделать отдельные классы и снабдить их такими же свойствами только с сеттерами, - потом в основной программе, - где нить в конструкторе через рефлексию соорудить связь между свойствами основного объекта, и того, который будет серилизоваться, - но способ ужасный хотя бы тем, что нужно задваивать по сути одинаковый код.

Код:
    public class TestBase 
    {
        public string  Prop1 { get; set; }
        public string Prop2 =>"some text" // это свойство не сериализуется
    }

// если пишу так, то возвращает исключение
[DataContract]
    public class TestBase 
    {
        [DataMember]
       public string  Prop1 { get; set; }
        [DataMember] // ошибка
        public string Prop2 =>"some text"
    }

// так выглядит настройка сервера - используется SelfHostConfiguration
_selfHostConfiguraiton = new HttpSelfHostConfiguration(_url);
            
            _selfHostConfiguraiton.Routes.MapHttpRoute(
                                                        name: "DefaultApiRoute",
                                                        routeTemplate: "api/{controller}/{action}",
                                                        defaults: null
                                                       );
            

            _server = new HttpSelfHostServer(_selfHostConfiguraiton);
            _task = _server.OpenAsync(); 

// так выглядит Web Api контроллер

public class TagsController : ApiController
    {
        
        public TestBase GetTest()
        {
            TestBase tag = new TestBase(){Prop1 = "hello"};
            return tag;
        }
   }
существует ли решение? спасибо

Последний раз редактировалось Sasha811; 17.09.2019 в 10:32.
Sasha811 вне форума Ответить с цитированием
Старый 17.09.2019, 10:49   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

если не надо десерелизовывать, то вроде можно пустой сеттер добавить.

Ну и разные другие извращения типа https://stackoverflow.com/a/26160509/964478 (internal поле + [assembly: InternalsVisibleTo("System.Runtime. Serialization")])

Цитата:
Сообщение от Sasha811 Посмотреть сообщение
Самый простой способ, сделать все с сеттером, но тогда я нарушу свои сущности, и они будут из себя представлять не то, что должны на самом деле.
В некоторых языках нет приватных и т.д. членов на уровне языка, и ничего, живы.

Никто ж не заставляет использовать сеттер для чего-то еще.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.09.2019, 19:36   #3
Sasha811
Пользователь
 
Регистрация: 20.12.2008
Сообщений: 22
По умолчанию

Спасибо, пустой сетер, - реально компромисс..В коде за периметром класса в него позволительно присваивать, но присвоения безсмыслены, так как "затираются" геттером
Sasha811 вне форума Ответить с цитированием
Старый 17.12.2019, 08:04   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Вообще-то так делать в корне не верно. Делать нормальным образом транспортные ссобщения и контракты - это одни классы. Их надо хранить в отдельной сборке и эта сборка не должна ни от кого зависеть. Внутренние классы - это другие классы. Не надо их смешивать. Что если нужно будет добавить методы, переименовать свойства, разделить класс не два и прочее? Менять контракт сервиса? А как их потом обновлять сервисы, которые потребляют этот контракт? Лучше выделить сборку с конрактами и сборку с внутренними классами. Для того, чтобы не писать код копирующий свойства между ними есть библиотеки, такие как: Automapper, TinyMapper и другие.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Java] Создание объекта внутри объекта этогоже класса. Svarogich Помощь студентам 2 01.08.2011 16:03
CLR. Ошибка C3918. Как вызвать из объекта обработчик, переданный родителю объекта от деда? Stilet Общие вопросы .NET 0 15.01.2011 17:49
Компонент со свойством TStrings. Impuls1989 Компоненты Delphi 15 17.09.2009 17:42
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52