我有以下课程......
export const createStory = () => (dispatch) => {
dispatch({ type: CREATE_STORY, payload: { storyId: uniqueId('new') } });
return Promise.resolve();
};
此背景可以在previous question of mine中找到,但您无需阅读该帖子,因为上述类只是查看问题所需的全部内容。
如果我有这样简化的WCF服务电话......
public abstract class Fallible<T> {
}
public class Success<T> : Fallible<T> {
public Success(T value) {
Value = value;
}
public T Value { get; private set; }
}
...然后当我尝试从使用它的WPF应用程序(或WCF测试客户端)调用该服务时,我得到[OperationContract]
public Fallible<Patient> GetPatient(int id) {
return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"});
}
异常......
尝试序列化参数时出错:GetPatientResult。该 InnerException消息是'Type'PhysioDiary.Entities.FallibleClasses.Success`1 [[PhysioDiary.Entities.Patient, PhysioDiary.Entities,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]' 数据合同名称&gt; 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' 不是预期的。如果您正在使用,请考虑使用DataContractResolver DataContractSerializer或将任何静态未知的类型添加到列表中 已知类型 - 例如,通过使用KnownTypeAttribute属性或 将它们添加到传递给序列化程序的已知类型列表中。'请 有关详细信息,请参阅InnerException。
......内部CommunicationException
例外......
输入'PhysioDiary.Entities.FallibleClasses.Success`1 [[PhysioDiary.Entities.Patient, PhysioDiary.Entities,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]' 数据合同名称&gt; 'SuccessOfPatient0yGilFAm:http://schemas.datacontract.org/2004/07/PhysioDiary.Entities.FallibleClasses' 不是预期的。如果您正在使用,请考虑使用DataContractResolver DataContractSerializer或将任何静态未知的类型添加到列表中 已知类型 - 例如,通过使用KnownTypeAttribute属性 或者将它们添加到传递给序列化程序的已知类型列表中。
我尝试将SerializationException
添加到班级,[DataContract]
添加到每个媒体资源,并为所涉及的所有四个类添加[DataMember]
属性,并添加[KnownType]
对于服务合同中的每一个,但没有任何帮助。
我已经阅读了同一个问题的无数答案,但没有发现任何可行的答案。我的服务返回其他自定义类,它们都被序列化而没有问题。
任何人都能解释这里的问题是什么?如果我没有提供足够的信息,请告诉我。
答案 0 :(得分:0)
原来我需要做的就是用基类型的[ServiceKnownType]
属性和每个派生类型来装饰服务方法......
[OperationContract]
[ServiceKnownType(typeof(Fallible<Patient>)]
[ServiceKnownType(typeof(Success<Patient>)]
[ServiceKnownType(typeof(BadIdea<Patient>)]
[ServiceKnownType(typeof(Failure<Patient>)]
public Fallible<Patient> GetPatient(int id) {
return new Success<Patient>(new Patient {ID = 1,FirstName = "Jim",Surname = "Spriggs"});
}
虽然为每次调用添加四个属性是一件痛苦的事,但它确实有效。我想知道是否有办法将它们组合成一个属性,但至少我现在有一个工作服务。
希望这有助于某人。