C# WCF InvalidDataContractException:“;类型不能序列化";但标记正确
我收到一个InvalidDataContractException: 无法序列化类型“LicenseWatchingServiceLibrary.LicenseInfoContainerExpiring”。考虑标记它[…] < /P> 但它已经被标记(参见代码)。我已经搜索过了,但我找到的解决方案都不适合我。这里使用WCF在Windows服务和ui应用程序之间进行通信。一些代码: 引发异常的位,位于windows wcf服务应用程序中:C# WCF InvalidDataContractException:“;类型不能序列化";但标记正确,c#,wcf,serialization,datacontract,datamember,C#,Wcf,Serialization,Datacontract,Datamember,我收到一个InvalidDataContractException: 无法序列化类型“LicenseWatchingServiceLibrary.LicenseInfoContainerExpiring”。考虑标记它[…] < /P> 但它已经被标记(参见代码)。我已经搜索过了,但我找到的解决方案都不适合我。这里使用WCF在Windows服务和ui应用程序之间进行通信。一些代码: 引发异常的位,位于windows wcf服务应用程序中: private void Run() {
private void Run()
{
//[...]
List<LicenseInfoContainerExpiring> expiringLicenses;
List<LicenseInfoContainerUntrusted> untrustedLicenses;
readLicenseInfoLists(out expiringLicenses, out untrustedLicenses, out warningNeeded);
if (warningNeeded)
{
LWSProxy.WatchLicenses(expiringLicenses, untrustedLicenses); //breaks here
}
}
添加知识类型:
[DataContract]
[KnownType(typeof(GregorianCalendar))]
public partial class LicenseInfoContainerExpiring : ILicenseInfoContainer
{}
您拥有具有私有setter的数据成员。这样就无法在反序列化时设置其值。把二传也公之于众 请记住,数据协定是实例化的,甚至在反序列化时也不调用默认构造函数
namespace LicenseWatchingServiceLibrary
{
[DataContract]
public partial class LicenseInfoContainerExpiring : ILicenseInfoContainer
{
#region precode
#region properties
[DataMember]
public string licenseName { get; set; }
[DataMember]
public DateTime licenseExpirationDate { get; set; }
// ...
}
}
如果您使用VisualStudio生成的代理,请尝试重新编译服务器,启动它,更新客户端上的服务引用并重新编译客户端…仍然是修复它的相同错误,谢谢!但我现在如何防止意外使用setter呢?正如我所知,并没有任何预防措施。方法可能是不在业务层中使用exchange对象,而是将此数据映射到具有所有限制的域对象。
[DataContract]
[KnownType(typeof(GregorianCalendar))]
public partial class LicenseInfoContainerExpiring : ILicenseInfoContainer
{}
namespace LicenseWatchingServiceLibrary
{
[DataContract]
public partial class LicenseInfoContainerExpiring : ILicenseInfoContainer
{
#region precode
#region properties
[DataMember]
public string licenseName { get; set; }
[DataMember]
public DateTime licenseExpirationDate { get; set; }
// ...
}
}