我有一组已经实现了ISerializable接口的用户定义类型,现在我想将它们托管在服务器端应用程序中,并通过使用DataContract属性将这些类型中的几个公开给客户端。
不幸的是,当我不能用DataContract属性标记相同的类时,因为它已经是ISerializable了,这会导致运行时异常。
但同时,我不能删除旧的用户定义类型中的ISerializable实现。
谁来帮帮我,我该如何向客户端公开这些类型..通过标记DataContract而不删除ISerializable
谢谢桑迪普
发布于 2011-03-19 00:44:02
这是明确禁止的--有关说明,请参阅http://blogs.msdn.com/b/sowmy/archive/2006/05/14/597476.aspx和http://blogs.msdn.com/b/sowmy/archive/2006/02/22/536747.aspx。
发布于 2012-11-12 19:26:47
由于版本控制,一个不能识别另一个: DataContract知道ISerializable是什么,但ISerializable不知道DataContract是什么
创建一个包装器怎么样?
然后发送要序列化/反序列化的包装器
[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);
}
}发布于 2021-10-29 15:49:00
十年后,因此不是为了行动,而是为了寻找这个问题的其他人…
根据您进行序列化的方式,您也许能够使用SerializationSurrogates。这允许您选择在调用时如何处理序列化:如果您指定了某个代理,它将使用该代理来执行序列化。如果您不指定它,它将使用默认值。
如果我们打算使用Mickey Perlstein在他们的答案中提供的示例作为起点,它可能如下所示:
[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一样,您可以使用此代理来执行此操作。主要从链接的文章中复制:
// 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;
}
}https://stackoverflow.com/questions/5086378
复制相似问题