我们刚刚发现在某个客户测试计算机上运行我们的系统时,我们收到了“框架错误”(由WCF日志报告)。
在我们的开发机器上一切正常。
我们有一个抽象基类,其所有子类都有KnownType属性。其中一个子类缺少它的DataContract属性。
然而,这一切都适用于我们的测试机器!
在客户测试计算机上,我们出现了“框架错误”,显示了WCF日志,这不是我在过去丢失DataContract属性或KnownType属性时看到的错误消息
我希望深究这一点, 因为我们再也没有信心了 我们之前测试系统的能力 直到我们可以把它交给客户 让我们的机器表现得像 客户的机器。
试图展示我所说的内容的代码(不是真正的代码)
[DataContract()]
[KnownType(typeof(SubClass1))]
[KnownType(typeof(SubClass2))]
// other subclasses with data members
public abstract class Base
{
[DataMember]
public int LotsMoreItemsThenThisInRealLife;
}
/// <summary>
/// This works on some machines (not not others) when passed to Contract::DoIt,
/// note the missing [DataContract()]
/// </summary>
public class SubClass1 : Base
{
// has no data members
}
/// <summary>
/// This works in all cases when passed to Contract::DoIt
/// </summary>
[DataContract()]
public class SubClass2 : Base
{
// has no data members
}
public interface IContract
{
void DoIt(Base[] items);
}
public static class MyProgram
{
public static IContract ConntectToServerOverWCF()
{
// lots of code ...
return null;
}
public static void Startup()
{
IContract server = ConntectToServerOverWCF();
// this works all of the time
server.DoIt(new Base[]{new SubClass2(){LotsMoreItemsThenThisInRealLife=2}});
// this works "in develperment" e.g. on our machines, but not on the customer's test machines!
server.DoIt(new Base[] { new SubClass1() { LotsMoreItemsThenThisInRealLife = 2 } });
}
}
更新我被告知.net 3.5 SP1在所有机器上,我还没有为自己确认这个。
答案 0 :(得分:2)
我们遇到了类似的问题:文件在我们所有的测试机器上进行了正确的数据协定反序列化。但是,在一台特定的客户计算机上,它失败并显示错误
ClassName 无法序列化。请考虑使用
DataContractAttribute
属性对其进行标记,并使用DataMemberAttribute
属性标记要序列化的所有成员。
原来,cusotmer运行的是.NET Framework 3.0,而我们所有的测试都是在.NET Framework 3.5 SP1上完成的。
似乎数据协定序列化程序的行为在.NET Framework 3.0和.NET Framework 3.5中是不同的。在3.5,如果一个类是XML可序列化的,那么它也是自动数据协定可序列化的。但是,.NET Framework 3.0不是这种情况 - 该类必须使用[DataContract]
或[Serializable]
进行修饰。
希望这有帮助!
答案 1 :(得分:0)
我认为问题是某些机器上没有3.5 SP1 。