XmlSerializer を取得して、クラスまたは構造体のプライベートおよび "public const" プロパティもシリアル化する最も簡単な方法は何ですか? 私のために出力されるのは、公開されているものだけではありません。プライベートにするか const を追加すると、値がシリアル化されません。
6 に答える
XmlSerializer
パブリックフィールドとプロパティのみを調べます。さらに制御が必要な場合は、IXmlSerializableを実装し、必要に応じてシリアル化できます。もちろん、定数に逆シリアル化することはできないため、定数をシリアル化してもあまり意味がありません。
プライベート プロパティをシリアル化することはできませんが、次のように内部セッターを使用してプロパティをシリアル化できます。
public string Foo { get; internal set; }
これを行うには、sgen.exe を使用してシリアル化アセンブリを事前に生成し、このアセンブリを friend として宣言する必要があります。
[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
.NET3.0で導入されたDataContractSerializerを確認してください。また、XML形式を使用しており、プライベートデータの処理を含め、多くの点でXmlSerializerよりも優れています。完全な比較については、http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/を参照してください。
.NET 2.0しかない場合は、プライベートデータを処理できるBinarySerializerがありますが、もちろんそれはバイナリ形式です。
const
メンバーはインスタンスごとではないため、メンバーを考慮することは意味がありません。ただし、非パブリック インスタンス メンバーだけを意味する場合: DataContractSerializer
(.NET 3.0) を検討してXmlSerializer
ください。
詳しくはこちらをご覧ください。
Newtonsoft.Json を使用するもう 1 つの解決策:
var json = Newtonsoft.Json.JsonConvert.SerializeObject(new { root = result });
var xml = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json);
確かに、これは残念ながらjson経由で迂回しています。