【发布时间】:2015-09-18 09:28:04
【问题描述】:
我在 MEF 应用程序中有以下设置:
组装MyBaseAssembly:
namespace My.Namespace
{
[DataContract]
public class Container
{
[DataMember]
public Data Item { get; set; }
}
[DataContract]
public class Data
{
[DataMember]
public string Foo { get; set; }
}
}
Assembly SecondAssembly,引用 MyBaseAssembly:
namespace My.Another.Namespace
{
[DataContract]
public class SecondData : Data
{
[DataMember]
public string Bar { get; set; }
}
}
我在应用程序内部的某个地方创建了一个Container 对象:
Container container = new Container();
container.Item = new SecondData { Bar = "test" };
我想序列化和反序列化 container 对象。由于 SecondAssembly 是一个 MEF 模块,我需要动态检测和解析数据协定中的类型,所以 KnownTypeAttribute 不是一个好的解决方案。
我创建了一个自定义DataContractResolver,但我不知道如何获取反序列化的程序集信息。
在序列化时,我得到以下 XML:
<d4p1:SecondData
xmlns:d6p1="http://schemas.datacontract.org/2004/07/My.Another.Namespace"
i:type="d7p1:My.Another.Namespace.SecondData">
...
</d4p1:SecondData>
这是默认的DataContract 序列化行为:我们得到类型名称和类型命名空间,但没有(显式)程序集信息!
尝试反序列化此 XML,我无法确定使用哪个程序集来解析类型:
class SerializationTypeResolver : DataContractResolver
{
...
public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
{
Type result = knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null);
if (result == null)
{
// Here, I cannot rely on the declaredType parameter,
// because it contains the declared type which is Data from MyBaseAssembly.
// But I need the SecondData from the SecondAssembly!
string assemblyName = ???; // How do I get this assembly name?
string fullTypeName = typeName + ", " + assemblyName;
result = Type.GetType(fullTypeName);
}
return result;
}
}
所以我的问题是:在序列化和反序列化 DataContracts 时存储和获取程序集名称的好方法是什么?
【问题讨论】:
-
@EhsanSajjad,这不起作用。我不想获取正在执行的程序集,我想确定序列化对象的类型所在的程序集。
-
如果你有
Type对象,你可以使用FullyQualifiedName属性:msdn.microsoft.com/en-us/library/… -
@EhsanSajjad,不,我没有
Type对象。我只有一个简短的类型名称及其名称空间作为字符串。请仔细阅读问题。 -
@dbc,实际上我可以随意更改 XML,因为它只会由我的反序列化器处理。当然,XML 应该是有效的。目前我倾向于将程序集信息嵌入到 XML 中的解决方案。
标签: c# xml xml-serialization .net-assembly datacontract