2012-02-20 3 views
0

Я пытаюсь отправить класс на wcf, у меня возникают проблемы с сериализацией этого класса System.Windows.Media.Media3D.Vector3d. Я получаю это исключениеИсключение в System.Windows.Media.Media3D.Vector3d сериализации по вызову wcf

При попытке сериализовать параметр WEntityService: iState произошла ошибка. Сообщение InnerException было «Тип» System.Windows.Media.Media3D.Vector3D 'с именем контракта данных ' Vector3D: http: //schemas.datacontract.org/2004/07/System.Windows.Media.Media3D 'не является ожидается. Рассмотрим с использованием DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer. '.
Для получения дополнительной информации см. InnerException.

[DataContract] 
    public ref class WData 
    { 
    public: 
    WData(); 

    [DataMember] 
    Vector3D^ mLinearVelocity; 

    [DataMember] 
    System::String^ mName; 
    }; 

WData::WData() 
    : mLinearVelocity(gcnew Vector3D(0.0, 0.0, 0.0))   
    , mName(gcnew System::String(' ', 1)) 
    { 

    } 

На веб-сайте MSDN http://msdn.microsoft.com/en-us/library/ms606682.aspx, вы можете увидеть, что Vector3D имеет Serializable attiribute. Для сериализуемого типа wcf, если я ссылаюсь на эту веб-страницу: http://msdn.microsoft.com/en-us/library/ms731923.aspx Vector3D должен быть сериализуем для wcf. Может кто-нибудь объяснить мне, почему это не сериализовано. Thks.

ответ

0

Можете ли вы добавить Vector3D в список известных типов? См. Пример ниже на уровне контракта данных. Я думаю, что это должно решить вашу проблему.

[DataContract] 
public class Book { } 

[DataContract] 
public class Magazine { } 

[DataContract] 
[KnownType(typeof(Book))] 
[KnownType(typeof(Magazine))] 
public class LibraryCatalog 
{ 
    [DataMember] 
    System.Collections.Hashtable theCatalog; 
} 

Если вы не можете добавить известного типа на уровне контракта данных, а также добавить его только на уровне контрактной службы, вы можете сделать что-то вроде ниже - добавьте [ServiceKnownTypeAttribute]!

// Apply the ServiceKnownTypeAttribute to the 
// interface specifying the type to include. Apply 
// the attribute more than once if needed. 
[ServiceKnownType(typeof(Widget))] 
[ServiceKnownType(typeof(Machine))] 
[ServiceContract()] 
public interface ICatalog2 
{ 
    // Any object type can be inserted into a Hashtable. The 
    // ServiceKnownTypeAttribute allows you to include those types 
    // with the client code. 
    [OperationContract] 
    Hashtable GetItems(); 
} 
Смежные вопросы