首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DataContractAttribute和ISerializable

使用DataContractAttribute和ISerializable
EN

Stack Overflow用户
提问于 2011-02-23 10:27:38
回答 3查看 6.1K关注 0票数 3

我有一组已经实现了ISerializable接口的用户定义类型,现在我想将它们托管在服务器端应用程序中,并通过使用DataContract属性将这些类型中的几个公开给客户端。

不幸的是,当我不能用DataContract属性标记相同的类时,因为它已经是ISerializable了,这会导致运行时异常。

但同时,我不能删除旧的用户定义类型中的ISerializable实现。

谁来帮帮我,我该如何向客户端公开这些类型..通过标记DataContract而不删除ISerializable

谢谢桑迪普

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-19 00:44:02

这是明确禁止的--有关说明,请参阅http://blogs.msdn.com/b/sowmy/archive/2006/05/14/597476.aspxhttp://blogs.msdn.com/b/sowmy/archive/2006/02/22/536747.aspx

票数 2
EN

Stack Overflow用户

发布于 2012-11-12 19:26:47

由于版本控制,一个不能识别另一个: DataContract知道ISerializable是什么,但ISerializable不知道DataContract是什么

创建一个包装器怎么样?

然后发送要序列化/反序列化的包装器

代码语言:javascript
复制
  [DataContract]
class Person 
{
    public Person()
    {

    }
    public Person(string firstName, string lastName):this()
    {
        this.FirstName = firstName;
        this.LastName = LastName;
    }

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

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

}

   [Serializable]
    class SerializablePersonWrapper : ISerializable 
    {
       SerializablePersonWrapper(SerializationInfo info,
                                 StreamingContext context)
        {
            string fname = info.GetString("FName");

            //did this just for answering any questions
            string lname = (string) info.GetValue("LName", typeof(string)); 

            this.PersonItem = new Person(fname, lname);

        }
       public Person PersonItem {get;set;}

       public void GetObjectData(SerializationInfo info, 
                                 StreamingContext context)
       {
           info.AddValue("FName", this.PersonItem.FirstName);
           info.AddValue("LName", this.PersonItem.LastName);
       }
    }
票数 1
EN

Stack Overflow用户

发布于 2021-10-29 15:49:00

十年后,因此不是为了行动,而是为了寻找这个问题的其他人…

根据您进行序列化的方式,您也许能够使用SerializationSurrogates。这允许您选择在调用时如何处理序列化:如果您指定了某个代理,它将使用该代理来执行序列化。如果您不指定它,它将使用默认值。

如果我们打算使用Mickey Perlstein在他们的答案中提供的示例作为起点,它可能如下所示:

代码语言:javascript
复制
[DataContract]
class Person 
{
    public Person()
    {

    }
    public Person(string firstName, string lastName):this()
    {
        this.FirstName = firstName;
        this.LastName = LastName;
    }

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

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

}


class PersonSerializationSurrogate : ISerializationSurrogate
{
   public string FirstName { get; set; }
   public string LastName  { get; set; }

   public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
    {
        var p = (Person)obj;
        info.AddValue(nameof(FirstName), p.FirstName);
        info.AddValue(nameof(LastName),  p.LastName);
    }

    public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
    {
        var p = (Person)obj;
        p.FirstName = info.GetString(nameof(FirstName));
        p.LastName  = info.GetString(nameof(LastName));

        return p;
    }
}

当您需要控制序列化过程时,就像使用ISerializable一样,您可以使用此代理来执行此操作。主要从链接的文章中复制:

代码语言:javascript
复制
// This sample uses the BinaryFormatter.
IFormatter formatter = new BinaryFormatter();

// Create a MemoryStream that the object will be serialized into and deserialized from.
using (Stream stream = new MemoryStream())
{
    // Create a SurrogateSelector.
    var ss = new SurrogateSelector();

    // using the Surrogate object.
    ss.AddSurrogate(typeof(Person),
        new StreamingContext(StreamingContextStates.All),
        new PersonSerializationSurrogate());

    // Associate the SurrogateSelector with the BinaryFormatter.
    formatter.SurrogateSelector = ss;

    try
    {
        // Serialize into the memory stream.
        formatter.Serialize(stream, new Person("Jeff", "Sandepku"));
    }
    catch (SerializationException e)
    {
        Console.WriteLine($"Serialization failed: {e.Message}");
        throw;
    }

    // Rewind the MemoryStream.
    stream.Position = 0;

    try
    {
        // Deserialize from the memory stream.
        var p = (Person) formatter.Deserialize(stream);

        // Verify that it all worked.
        Console.WriteLine($"Name is {p.FirstName} {p.LastName}");
    }
    catch (SerializationException e)
    {
        Console.WriteLine($"Deserialization failed: {e.Message}");
        throw;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5086378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档