Сериализация .NET-типа из LdapConnection - PullRequest
1 голос
/ 04 марта 2011

У меня проблема в том, что я использую LdapConnection для отправки запросов к хранилищу данных AD LDS (ранее известному как ADAM). Хорошо. Но теперь появились требования, чтобы иметь возможность «удаленно» сделать это. По сути, программа, на которую мы могли рассчитывать, всегда имея доступ к хранилищу данных, теперь должна делать это через «серверную» программу во «внутренней» сети, чтобы «клиент» во внешней связывался только через наш новый «сервер». программа. Есть причина (не хорошая, но причина), почему мы не можем просто выставить сервер AD LDS на улицу. Но они хотят, чтобы это было сделано «быстро», и, следовательно, не хотят переделывать клиентское приложение (как и должно быть в действительности). Таким образом, нам нужно сериализовать DataRequest и DataResponse s для перехода к серверной части и обратно.

Большая проблема: DataResponses не являются сериализуемыми. Во время тестирования DataContractSerializer не имеет проблем с сериализацией моего SearchRequest, но SearchResponse получает это:

System.Runtime.Serialization.InvalidDataContractException occurred
  Message="Type 'System.DirectoryServices.Protocols.SearchResponse' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.  See the Microsoft .NET Framework documentation for other supported types."
  Source="System.Runtime.Serialization"
  StackTrace:
       at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type)
  InnerException: 

OK. Но ни один тип не имеет Serializable или что нет. Так почему же SearchRequest проходит процесс нормально, а ответ - нет?

Но это не имеет значения, в конце концов. Как я должен сериализовать тип, который я не могу изменить, поскольку он встроен в платформу .NET, и я не могу «переделать», потому что конструктор является внутренним? Если бы я мог просто «взять нужную мне информацию» и заново создать класс на другом конце моего сетевого подключения, я бы это сделал, но у этих типов нет открытых конструкторов.

Есть идеи? Я даже хотел бы знать, почему один из типов «просто работает» даже без правильных атрибутов для DataContractSerializer, а другой - нет.

1 Ответ

2 голосов
/ 04 марта 2011

Лучший - и, вероятно, единственный - подход - создать собственный класс-обертку, а затем прочитать результат и сохранить его в классе и сериализовать.

SearchResponse фактически является оболочкой COM и не может быть сериализован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...