我有一个序列化的数据类DataContractSerializer.该类使用[DataContract]没有显式Namespace声明的属性.因此,生成的xml文件中的命名空间是基于类的命名空间生成的.
该课程基本上如下:
namespace XYZ
{
[DataContract]
public class Data
{
[DataMember(Order = 1)]
public string Prop1 { get; set; }
[DataMember(Order = 2)]
public int Prop2 { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
...以及生成的xml:
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XYZ">
<Prop1>StringValue</Prop1>
<Prop2>11</Prop2>
</Data>
Run Code Online (Sandbox Code Playgroud)
现在我想通过将[DataContract]属性更改为更改类的名称空间(实际上将其删除)[DataContract(Namespace = "")].但是,一旦我执行此操作,之前使用原始命名空间序列化的文件不再反序列化.我收到以下异常:
Error in line 1 position XXX. Expecting element 'Data' from namespace ''.. Encountered 'Element' with name 'Data', namespace 'http://schemas.datacontract.org/2004/07/XYZ'.
这很有道理.我更改了命名空间.我很好.但是,似乎必须有一种方法可以告诉它DataContractSerializer继续并反序列化该数据,即使名称空间不匹配.
我正在尝试创建包含Castle.Core的FakeItEasy的合并版本.我读到了有关ILMerge的信息,看起来这是我需要的解决方案.下载并构建FakeItEasy后,我将所需的所有文件(FakeItEasy.dll(.NET4),Castle.Core.dll(.NET4),ilmerge.exe,FakeItEasy.snk)复制到同一文件夹中.然后我运行以下命令:
ilmerge
/keyfile:FakeItEasy.snk
/out:..\FakeItEasy.dll
/t:library
/targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319
FakeItEasy.dll Castle.Core.dll
Run Code Online (Sandbox Code Playgroud)
得到以下结果:
An exception occurred during merging:
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at System.Compiler.Writer.MscorsnStrongNameSignatureGeneration(String wszFilePath, String wszKeyContainer, Byte[] pbKeyBlob, Int32 cbKeyBlob, IntPtr ppbSignatureBlob, IntPtr pcbSignatureBlob)
at System.Compiler.Writer.WritePE(String location, Boolean writeDebugSymbols, Module module, Boolean delaySign, String keyFileName, String keyName)
at System.Compiler.Writer.WritePE(CompilerParameters compilerParameters, Module module)
at ILMerging.ILMerge.Merge()
at ILMerging.ILMerge.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)
如果我放弃"/keyfile:FakeItEasy.snk",合并的程序集就会很好地创建,但这对我没有帮助,因为我需要一个签名版本.
我也尝试将目标平台指定为:
/targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319
Run Code Online (Sandbox Code Playgroud)
但结果是一样的.