1
宣言されたタイプのプロパティのみをシリアル化およびデシリアライズする最も単純な方法は、実際のオブジェクトが宣言されたものよりも派生しているという事実を無視していますか?これらのクラスとインスタンスの場合:DataContractSerializerで基本クラスのプロパティのみをシリアル化/逆シリアル化する方法
[DataContract]
public class Base
{
[DataMember]
string BaseProperty { get; set; }
}
public class Derived : Base
{
string DerivedProperty { get; set; }
}
私はこれと同等のものを達成できるようにしたいと思います:
Base baseObject = new Derived();
var baseSerializer = new DataContractSerializer(typeof(Base));
using (var fileStream = File.OpenWrite("file"))
using (var writer = XmlDictionaryWriter.CreateBinaryWriter(fileStream))
{
baseSerializer.WriteObject(writer, baseObject);
}
using (var fileStream = File.OpenRead("file"))
using (var reader = XmlDictionaryReader.CreateBinaryReader(fileStream, new XmlDictionaryReaderQuotas()))
{
var deserialized = (Base)baseSerializer.ReadObject(reader);
}
提供されるサンプルコードは失敗しDerived
はもちろん、既知のタイプではないので。しかし、私は追加情報をファイルに書き込むことに興味はなく、ベースクラスが提供するものだけに興味があります。
'KnownTypeAttribute'をどこかに追加する必要はありませんか? https://msdn.microsoft.com/en-us/library/system.runtime.serialization.knowntypeattribute(v=vs.110).aspx – Michael
これは、リストに 'Derived 'を単に追加することで動作することができます既知のタイプのもの。しかし、私は明らかにこれをしたくありません。私は実際のオブジェクトが単純な 'Base'ではないという事実を無視したいと思います。 –
XmlDictionaryWriterは型情報を保存する傾向があります。 JSONなどのデフォルトタイプのサポートなしでシリアライザを使用するだけです。 Newtonsoft.JSONでは、シリアライズ契約を指定して、シリアライズするものと一般的でないものを指定することができます。 – eocron