Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DataContractSerializer自定义序列化_C#_Serialization_Datacontractserializer_Datacontract - Fatal编程技术网

C# 使用DataContractSerializer自定义序列化

C# 使用DataContractSerializer自定义序列化,c#,serialization,datacontractserializer,datacontract,C#,Serialization,Datacontractserializer,Datacontract,我目前正在为我的数据集使用包装器类,以便实现自定义序列化。我想使用DataContractSerializer(更像是必须使用它),但仍然支持自定义序列化。问题是[DataContract]和[Serializable]属性似乎相处不太好。。。如何覆盖序列化,并同时支持DataContract和ISerializable序列化? 包装器数据集类的代码如下所示: [Serializable()] [System.Runtime.InteropServices.ComVisible(fals

我目前正在为我的数据集使用包装器类,以便实现自定义序列化。我想使用
DataContractSerializer
(更像是必须使用它),但仍然支持自定义序列化。问题是
[DataContract]
[Serializable]
属性似乎相处不太好。。。如何覆盖序列化,并同时支持DataContract和ISerializable序列化? 包装器数据集类的代码如下所示:

[Serializable()]    
[System.Runtime.InteropServices.ComVisible(false)]
public class TestDatasetWrapper : TestDataSet, ISerializable
{
    public TestDatasetWrapper()
        : base()
    {}

    protected TestDatasetWrapper(SerializationInfo info, StreamingContext context)
    {
        SerializationHelper.DeserializeTypedDataSet(info, this);
    }

    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        SerializationHelper.AddTypedDataSetObjectData(info, this);
    }
}

谢谢

DataContractAttribute和SerializableAttribute都可以一起使用。这里的好处是,您也不需要使用单独的序列化程序。DataContractSerializer是一个XmlObjectSerializer,它本身支持[Serializable]。例如:

[Serializable]
public class TestClass
{
    public string Name { get; set; }
}

{
    var formatter = new DataContractSerializer(typeof(TestClass));
    using (var stream = new MemoryStream())
    {
        var instance = new TestClass { Name = "Matt" };
        formatter.WriteObject(stream, instance);

        stream.Seek(0, SeekOrigin.Begin);

        var second = (TestClass) formatter.ReadObject(stream);
        Console.WriteLine(second.Name);
    }
}
输出:“马特”

仅使用一个SerializableAttribute属性,我们就可以使用DataContractSerializer成功地序列化和反序列化对象

使用ISerializable,我们可以做同样的事情:

[Serializable]
public class TestClass2 : ISerializable
{
    public TestClass2() { }
    protected TestClass2(SerializationInfo info, StreamingContext context)
    {
        Name = info.GetString("name").ToUpper();
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("name", Name);
    }

    public string Name { get; set; }
}

{
    var formatter = new DataContractSerializer(typeof(TestClass2));
    using (var stream = new MemoryStream())
    {
        var instance = new TestClass2 { Name = "Matt" };
        formatter.WriteObject(stream, instance);

        stream.Seek(0, SeekOrigin.Begin);

        var second = (TestClass2)formatter.ReadObject(stream);
        Console.WriteLine(second.Name);
    }
}
输出:“马特”

并具有DataContractAttribute:

[DataContract, Serializable]
public class TestClass3
{
    public int Age { get; set; }

    [DataMember]
    public string Name { get; set; }
}

{
    var formatter = new DataContractSerializer(typeof(TestClass3));
    using (var stream = new MemoryStream())
    {
        var instance = new TestClass3 { Name = "Matt", Age = 26 };
        formatter.WriteObject(stream, instance);

        stream.Seek(0, SeekOrigin.Begin);

        var second = (TestClass3)formatter.ReadObject(stream);
        Console.WriteLine(second.Name);
        Console.WriteLine(second.Age);
    }
}
输出:“马特”

输出:0

当DataContractSerializer遇到具有DataContractAttribute的类型时,它将使用该类型,而不是将序列化传递给其基类型,该基类型处理SerializableAttribute和ISerializable接口


如果遇到问题,是序列化还是反序列化,或者两者都有?

所有3个示例似乎都缺少函数签名行。