Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF InvalidDataContractException:“;类型不能序列化";但标记正确_C#_Wcf_Serialization_Datacontract_Datamember - Fatal编程技术网

C# WCF InvalidDataContractException:“;类型不能序列化";但标记正确

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() {

我收到一个InvalidDataContractException:

无法序列化类型“LicenseWatchingServiceLibrary.LicenseInfoContainerExpiring”。考虑标记它[…] < /P> 但它已经被标记(参见代码)。我已经搜索过了,但我找到的解决方案都不适合我。这里使用WCF在Windows服务和ui应用程序之间进行通信。一些代码:

引发异常的位,位于windows wcf服务应用程序中:

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; }

        // ...
    }
}