Проблемы WCF с KnownType для словаря - PullRequest
1 голос
/ 10 июня 2010

У меня есть служба, которая реализует следующий DataMember:

[DataMember]
public Dictionary<string, List<IOptionQueryResult>> QueryResultItems { get; set; }

У меня есть класс "OptionQuerySingleResult", который наследуется от IOptionQueryResult.Теперь я понимаю, что мне нужно сделать тип OptionQueryResult «известным» для Службы, и поэтому я попытался добавить KnownType различными способами:

[KnownType(typeof(Dictionary<string, OptionQuerySingleResult[]>))]
[KnownType(typeof(Dictionary<string, List<OptionQuerySingleResult>>))]
[KnownType(typeof(OptionQuerySingleResult)]

Однако ни один из этих подходов не работал и на стороне клиента.Я либо получаю, что десериализация завершилась неудачно, либо сервер просто прервал запрос, вызвав ошибку прерванного соединения.

У кого-нибудь есть идеи о том, как правильно заставить это работать?Я хотел бы добавить, что если я изменю определение QueryResultItems, чтобы использовать конкретный тип вместо интерфейса, все будет работать просто отлично.

Спасибо,

Том

Изменить: Исключение, которое я получаю:

Ошибка в строке 1 позиции 524. Элемент 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType' содержит данные из типа, который сопоставляется с именем': OptionQuerySingleResult '.Десериализатор не знает ни одного типа, который сопоставляется с этим именем.Попробуйте использовать DataContractResolver или добавить тип, соответствующий OptionQuerySingleResult, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив его в список известных типов, передаваемых DataContractSerializer.

Однакокогда я смотрю на клиентский прокси, который генерирует svcutil, в нем определенно определяется «OptionQuerySingleResult»:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="OptionQuerySingleResult", Namespace="")]
[System.SerializableAttribute()]
public partial class OptionQuerySingleResult : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 

Ответы [ 2 ]

1 голос
/ 10 июня 2010

Я думаю, вы бы использовали:

[KnownType(typeof(OptionQuerySingleResult)]

Но вам также нужно [DataContract(Name = "OptionQuerySingleResult")] для вашего класса OptionQuerySingleResult.

Я думаю, это также зависит от ваших прокси-классов клиента, генерируемыхутилита SVCUTIL.EXE.

0 голосов
/ 20 августа 2013

Вам просто нужно добавить следующее свойство в ваш класс datacontract.

[DataMember]
public object UsedForKnownTypeSerializationObject;

Так что теперь сгенерированный прокси-сервер содержит типы знаний, которые вы установили в datacontract.У меня была та же проблема, и это единственное решение, которое я придумал.Если у вас нет свойства типа Object для класса DataContract, сгенерированный прокси-сервер не содержит объявленных типов знаний

Например:

[DataContract]
[KnownType(typeof(List<String>))]
public class Foo
{
    [DataMember]
    public String FooName { get; set; }

    [DataMember]
    public IDictionary<String, Object> Inputs { get; set; }

    [DataMember]
    private Object UsedForKnownTypeSerializationObject{ get; set; }

}

Это не так красиво, потому чтов итоге вы получите фиктивное свойство, которое не имеет никакой функциональной реализации.Но опять же у меня нет другого решения.

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