C# 无法反序列化值类型的IComparable字段

C# 无法反序列化值类型的IComparable字段,c#,.net,serialization,C#,.net,Serialization,我调查了一个关于IComparable属性二进制序列化的问题,该问题在为IComparable属性分配DateTime时导致以下错误: 二进制流“0”不包含有效的BinaryHeader 以下代码可能导致此问题: /// <summary> /// This class is injected with an icomparable object, which is assigned to a property. /// If serialized then deserializes

我调查了一个关于IComparable属性二进制序列化的问题,该问题在为IComparable属性分配DateTime时导致以下错误:

二进制流“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对象,该对象被指定给属性。
///如果序列化,然后使用二进制序列化进行反序列化,则会引发异常
/// 
[可序列化]
公共类某些类不工作
{
公共SomeClassNotWorking(IComparable属性)
{
财产=财产;
}
公共不可比财产;
}
公共课程
{
静态void Main(字符串[]参数)
{
//var Compariable=新的SomeClass(DateTime.Today);
//这里我们传入一个继承IComparable的datetime类型(ISerializable也会产生错误!!)
var instance=newsomeclassnotworking(DateTime.Today);
//现在我们序列化
var bytes=BinaryHelper.Serialize(实例);
WriteToFile(“serialisedResults”,字节);
//然后反序列化
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;
}
//
///此类包含实现IComparable的泛型类型属性
///这将正确地序列化和反序列化,不会出错
/// 
/// 
[可序列化]
公共类SomeClass其中T:i可比较
{
公共类(T属性)
{
财产=财产;
}
公共财产;
}

这可以毫无问题地进行序列化和反序列化。但是,为什么IComparable属性的序列化(当该属性是DateTime时)首先会导致问题,特别是DateTime支持IComparable时?ISerializable也会发生这种情况

这是一个已知的错误,尚未修复:

这可能与您无法创建接口实例直接相关。@Bob2Chiv当他提供IComparable的实现时,它可以工作。这是一个已知的错误。@Adriano有趣的是,我认为这是因为可以序列化T的实例,但不能序列化IComparable的实例;即使有一个具体的价值与之相关,就像这样。很高兴知道这个错误,但是。@Bob2Chiv我仍然不明白为什么它没有被修复!我想是为了兼容,但我无法想象如何兼容。无论如何,这似乎只发生在值类型上。不同的值类型产生不同的结果/异常。如果我传入一个int而不是DateTime,我会得到以下错误-SerializationException-解析完成前遇到的流结束。@mmd是的,可能这取决于数据的反序列化方式,但我同意,这是一件非常愚蠢的事情…一个结果不一致的已知错误没有多大帮助!遗憾的是,没有计划的修复,所涉及的工作超过了好处@阿德里亚诺-谢谢你的信息和链接。