IComparable プロパティに DateTime が割り当てられると、次のエラーが発生する IComparable プロパティのバイナリ シリアル化に関する問題を調査しました。
バイナリ ストリーム '0' には、有効な BinaryHeader が含まれていません。
次のコードでこの問題が発生する可能性があります。
/// <summary>
/// This class is injected with an icomparable object, which is assigned to a property.
/// If serialized then deserializes using binary serialization, an exception is thrown
/// </summary>
[Serializable]
public class SomeClassNotWorking
{
public SomeClassNotWorking(IComparable property)
{
Property = property;
}
public IComparable Property;
}
public class Program
{
static void Main(string[] args)
{
// var comparable = new SomeClass<DateTime>(DateTime.Today);
// here we pass in a datetime type that inherits IComparable (ISerializable also produces the error!!)
var instance = new SomeClassNotWorking(DateTime.Today);
// now we serialize
var bytes = BinaryHelper.Serialize(instance);
BinaryHelper.WriteToFile("serialisedResults", bytes);
// then deserialize
var readBytes = BinaryHelper.ReadFromFile("serialisedResults");
var obj = BinaryHelper.Deserialize(readBytes);
}
}
IComparable プロパティを IComparable を実装するタイプ T プロパティに置き換えることで問題を解決しました。
/// <summary>
/// This class contains a generic type property which implements IComparable
/// This serializes and deserializes correctly without error
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public class SomeClass<T> where T : IComparable
{
public SomeClass(T property)
{
Property = property;
}
public T Property;
}
これにより、問題なくシリアル化および逆シリアル化されます。ただし、特に DateTime が IComparable をサポートしているため、IComparable プロパティのシリアル化 (そのプロパティが DateTime の場合) がそもそも問題を引き起こすのはなぜでしょうか? これは、ISerializable でも発生します。