シリアル化するデータを含むクラスがあります。
[Serializable]
public class SomeData {
public int NumericField;
public string StringField;
}
便利な拡張メソッドがあります。
public static string ToJson<T> (this T value) {
// yay no compile-time checks for [Serializable]?
if (!typeof(T).IsSerializable)
throw new SerializationException("Object lacks [Serializable] attribute");
var serializer = new DataContractJsonSerializer(typeof(T));
using (var stream = new MemoryStream()) {
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8)) {
serializer.WriteObject(writer, value);
}
return Encoding.UTF8.GetString(stream.ToArray());
}
}
私は実際にはクラスSomeData
を実装したいISerializable
のですが、それを追加すると、メソッドを追加する必要があると言われます。
error CS0535: 'SomeData' does not implement interface member
System.Runtime.Serialization.ISerializable.GetObjectData(
System.Runtime.Serialization.SerializationInfo,
System.Runtime.Serialization.StreamingContext)'
問題は、現在実行していることを正確に実行するだけでなく、クラスに制限ToJson<T>
してISerializable
、回避可能な例外をスローするようなものを誤って渡さないようにすることです。このような:
public static string ToJson<T> (this T value) where T : ISerializable
インターフェイスGetObjectData
を追加しない場合に得られる正確な動作を複製する、簡潔な実装またはその他のトリックはありますか?ISerializable
継承するクラスに含めることができるもの、または簡潔な(そして常にまったく同じ)ものが必要です。すべてのクラスに貼り付けるだけで、何[Serializable]
が起こるかを正確に把握できます。一般的なもの。パフォーマンスは大きな問題ではありませんが、使用できるのは.NetFramework3.5のみです。
アップデート:
私は[DataContract]
の代わりに完全に使用したいと思っています[Serializable]
が、それを実行した場合、実装できる一般的な方法があるので、実装しなかった場合とISerializable
まったく同じように動作しますか?(上記と同じqnで、どこにでも表示されます)[DataContract]
ISerializable
DataContract
Serializable