我正在寻找一种方法来序列化包含一些只读属性的 POCO。在一些 Google 和 StackOverflow 搜索中,我看到了以下建议:
我的类(class)非常简单,它们看起来像:
public class MyClass
{
public int Id { get; private set; }
public string Name { get; private set; }
public MyClass(int id, string name)
{
Id = id;
Name = name;
}
}
所以,
DataContractSerializer
,因为这会用与序列化相关的东西污染我的域模型。 BinaryFormatter
不是一个很好的选择,因为结果是 byte[]
, 我想把它当作 string
(我不想在反序列化我的对象时处理 Encondings 等)。 我真正想要的是 能够序列化只读属性的 XmlSerializer 类 .
你知道任何这样的实现吗?或者任何其他方便的解决方案?
谢谢!
最佳答案
好吧,通常 XmlSerializer
无法序列化只读属性...但是可以使用内部集序列化属性:您需要生成 XML 序列化程序集,并使用 InternalsVisibleTo
将其声明为“ friend ”程序集属性。您可以通过将以下代码添加到项目文件来自动执行此操作:
<Target Name="AfterBuild"
DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
Outputs="$(OutputPath)$(_SGenDllName)">
<SGen BuildAssemblyName="$(TargetFileName)"
BuildAssemblyPath="$(OutputPath)"
References="@(ReferencePath)"
ShouldGenerateSerializer="true"
UseProxyTypes="false"
KeyContainer="$(KeyContainerName)"
KeyFile="$(KeyOriginatorFile)"
DelaySign="$(DelaySign)"
ToolPath="$(SGenToolPath)">
<Output TaskParameter="SerializationAssembly"
ItemName="SerializationAssembly" />
</SGen>
</Target>
在 AssemblyInfo.cs 中:
[assembly: InternalsVisibleTo("MyAssembly.XmlSerializers")]
当然,您可能不希望属性具有内部集,但如果您这样做,上述解决方案应该可以工作。
关于.net - 序列化为 XML - 私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1347102/