我正在尝试获取我在服务器上收到的一个datacontract对象,对它进行一些操作,然后返回它的一个向上转换的版本,但它似乎不起作用。我可以通过使用KnownType或ServiceKnownType属性让它工作,但我不想往返所有的数据。下面是一个示例:
[DataContract]
public class MyBaseObject
{
[DataMember]
public int Id { get; set; }
}
[DataContract]
public class MyDerivedObject : MyBaseObject
{
[DataMember]
public string Name { get; set; }
}
[ServiceContract(Namespace = "http://My.Web.Service")]
public interface IServiceProvider
{
[OperationContract]
List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects);
}
public class ServiceProvider : IServiceProvider
{
public List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects)
{
... do some work ...
myDerivedObjects[0].Id = 123;
myDerivedObjects[1].Id = 456;
myDerivedObjects[2].Id = 789;
... do some work ...
return myDerivedObjects.Cast<MyBaseObject>().ToList();
}
}有人知道如何在不重新创建新对象或使用KnownType属性的情况下让它工作吗?
发布于 2009-06-21 21:28:39
我认为你的问题是你试图发送一个通用的列表。
如果您将列表封装在一个对象中,它将会起作用。也就是说,创建一个具有单个公共属性的对象,该属性是泛型列表。
您还需要确保将协定中未直接使用的所有类标记为可序列化。
发布于 2009-06-22 06:30:09
如果你想返回派生的对象,那么总是会有一个往返过程,因为客户端和服务是分开的。为了让客户机更新它自己的MyBaseObjects列表,它必须反序列化来自服务器的MyDerivedObjects列表。
需要使用WSDL和/或ServiceKnownType,因为这会导致将该类型信息添加到WSDL中,而客户端将使用该信息将消息反序列化为正确的类型。
对于初学者,一个用于测试您描述的场景的有用工具:http://www.wcfstorm.com
发布于 2009-11-08 14:55:34
您可以尝试创建一个DataContractSurrogate (IDataContractSurrogate)并为GetDataContractType调用返回您的基类型。我真的不确定这是如何使用它的,所以你可能仍然会更好地使用“额外的工作”,但也许我不理解额外工作的范围。
https://stackoverflow.com/questions/1024723
复制相似问题