gpt4 book ai didi

wcf - 有没有人创建过 DataContract 测试工具?

转载 作者:行者123 更新时间:2023-12-03 23:50:16 25 4
gpt4 key购买 nike

有没有人见过测试 WCF DataContracts 的库?提出这个问题的动机是我刚刚在我的应用程序中发现了一个错误,该错误是由于我没有使用 DataMember 属性注释属性而导致的 - 结果,该属性没有被序列化。

我想到的是一个 API,给定特定类型的 DataContract,它将自动使用随机数据填充其成员,包括任何子 DataContracts,然后通过 WCF 序列化程序/格式化程序之一对其进行序列化,然后检查所有数据被带走了。

任何人?

最佳答案

使用 DataContractSerializer 将对象序列化为 MemoryStream ,然后将其反序列化为新实例,这很简单。

这是一个演示这种往返序列化的类:

public static class WcfTestHelper
{
/// <summary>
/// Uses a <see cref="DataContractSerializer"/> to serialise the object into
/// memory, then deserialise it again and return the result. This is useful
/// in tests to validate that your object is serialisable, and that it
/// serialises correctly.
/// </summary>
public static T DataContractSerializationRoundTrip<T>(T obj)
{
return DataContractSerializationRoundTrip(obj, null);
}

/// <summary>
/// Uses a <see cref="DataContractSerializer"/> to serialise the object into
/// memory, then deserialise it again and return the result. This is useful
/// in tests to validate that your object is serialisable, and that it
/// serialises correctly.
/// </summary>
public static T DataContractSerializationRoundTrip<T>(T obj,
IEnumerable<Type> knownTypes)
{
var serializer = new DataContractSerializer(obj.GetType(), knownTypes);
var memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
obj = (T)serializer.ReadObject(memoryStream);
return obj;
}
}

您负责的两项任务:
  • 首先用合理的数据填充实例。您可能会选择使用反射来设置属性或提供带有参数的构造函数,但我发现这种方法除了非常简单的类型外,不适用于任何其他类型。
  • 在往返反序列化后比较这两个实例。如果您有可靠的 Equals/GetHashCode 实现,那么这可能已经为您完成了。同样,您可能会尝试使用通用反射比较器,但这可能并不完全可靠。
  • 关于wcf - 有没有人创建过 DataContract 测试工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/970828/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com