Абстрактные классы в клиентской библиотеке и конкретный класс в общей библиотеке - PullRequest
1 голос
/ 02 сентября 2011

Как решить проблему сериализации с помощью абстрактного класса, определенного в общей клиентской библиотеке, и конкретной реализации в библиотеке на стороне сервера.

Interface in shared client library :

  [ServiceContract(SessionMode=SessionMode.Required)]
  [ServiceKnownType(typeof(SharedClient.Shape))]
  public interface IMyInterface
  {
    void UploadDrawing(Drawing dr);
  }

Concreate Drawing class in shared client library :

  [DataContract]
  [KnownType(typeof(SharedClient.Shape))]
  public class Drawing
  {
    public Shape s;
  }

Abstract class in shared client library :

  [DataContract]
  abstract public class Shape
  {
    [DataMember]
    public abstract string Name;
  }

Concrete class implementation in separate library which references the client library :

  [DataContract]
  public class Cirle : ClientLibrary.Shape
  {
    public override string Name { get; set; } 
  }

Я получаю сообщение об исключении:

Произошла ошибка при попытке сериализации параметра http://tempuri.org/:Drawing. Сообщение InnerException было 'Тип «Круг» с названием контракта данных 'Круг: http://schemas.datacontract.org/2004/07/' не ожидается. Рассмотрите возможность использования DataContractResolver или добавьте какие-либо типы, не известные статически к списку известных типов - например, с помощью Атрибут KnownTypeAttribute или путем добавления их в список известных типы, переданные в DataContractSerializer. '. Пожалуйста, смотрите InnerException для более подробной информации.

1 Ответ

1 голос
/ 03 сентября 2011

KnownType работает по-другому.Если вы хотите использовать атрибут KnownType, вы должны использовать его в базовом классе, чтобы определить его дочерний элемент:

[DataContract]
[KnownType(typeof(Circle))]
abstract public class Shape
{
    [DataMember]
    public abstract string Name;
}  

Это не будет слишком полезно в вашем случае.Попробуйте установить ServiceKnownType с конкретным классом на вашем интерфейсе:

[ServiceContract(SessionMode=SessionMode.Required)]
[ServiceKnownType(typeof(Circle))]
public interface IMyInterface
{
    void UploadDrawing(Drawing dr);
}

Вам не нужно определять Shape как ServiceKnownType - это уже известно, поскольку оно используется в Drawing, но WCF ещене знает тип Circle.

...