我有一个使用 3rd 方库的 WCF 服务。该库不可序列化。
我有一个可序列化的自定义类型,还包括一个来自 3rd 方库的类作为属性。看起来像:
MyClass.ThirdPartyClass
问题是当我将 MyClass 发送出服务时,ThirdPartyClass 会丢失我在服务中分配给它的值。由于我没有 ThirdPartyClass 的来源,我可以将其标记为可序列化。
有什么方法可以将 ThirdPartyClass 标记为可序列化或其他方式让它保留值?
我建议创建一个数据传输对象,其中包含您要通过服务提供的数据。不要让 ThirdPartyClass 成为 MyClass 的一部分,而是使用新的 DTO 并将 ThirdPartyClass 的数据映射到 DTO,然后再从服务返回。也许像 AutoMapper 这样的框架可以支持你完成这项任务。
虽然这意味着一些额外的工作,但它也在您的服务的客户端和 3rd 方库之间创建了一个抽象层。这使您能够稍后更改到另一个库,而无需更改服务的接口。
我过去处理此类问题的方法是创建一个您控制的“影子”类,该类可序列化并包含您想要公开的该类的部分。
然后,您的类中有两个属性,一个严格用于序列化,一个用于内部使用。
例如,假设第三方类如下所示:
public class ThirdPartyClass
{
public int Property1 { get; set; }
public string Property2 { get; set; }
}
您可以像这样创建一个可序列化的版本(假设您使用的是 DataContracts):
[DataContract()]
public class ThirdPartyClassSerializable
{
private ThirdPartyClass m_TPC = new ThirdPartyClass();
public ThirdPartyClassSerializable();
public ThirdPartyClassSerializable(ThirdPartyClass oTPC)
{
m_TPC = oTPC;
}
public ThirdPartyClass GetThirdPartyClass()
{
return m_TPC;
}
[DataMember()]
public int Property1
{
get
{
return m_TPC.Property1;
}
set
{
m_TPC.Property1 = value;
}
}
[DataMember()]
public string Property2
{
get
{
return m_TPC.Property2;
}
set
{
m_TPC.Property2 = value;
}
}
}
然后您的根可序列化类将如下所示:
[DataContract()]
public class MyClass
{
private ThirdPartyClass m_ThirdPartyClass;
public ThirdPartyClass ThirdPartyClass
{
get
{
return m_ThirdPartyClass;
}
set
{
m_ThirdPartyClass = value;
}
}
[DataMember()]
public ThirdPartyClassSerializable ThirdPartyClassSerialized
{
get
{
return new ThirdPartyClassSerializable(this.ThirdPartyClassNonSerialized);
}
set
{
this.ThirdPartyClass = value.GetThirdPartyClass();
}
}
}
使用这种方法,数据按预期序列化给外部调用者,并且原始类始终可供内部调用者使用。
这样做的第二个优点是您可以根据需要或需要公开尽可能多或尽可能少的第三方类。