- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为包含相似类型子项列表的 C# 类实现 ISerializable。考虑以下示例:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace serialisation
{
[Serializable]
internal class Nested : ISerializable
{
public string Name { get; set; }
public List<Nested> Children { get; set; }
public Nested(string name)
{
Name = name;
Children = new List<Nested>();
}
protected Nested(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
Name = info.GetString("Name");
// This doesn't work:
Nested[] children = (Nested[])info.GetValue("Children", typeof(Nested[]));
Children = new List<Nested>(children);
// This works:
// Children = (List<Nested>)info.GetValue("Children", typeof(List<Nested>));
}
public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
info.AddValue("Name", Name);
// This doesn't work:
info.AddValue("Children", Children.ToArray());
// This works:
//info.AddValue("Children", Children);
}
}
internal class Program
{
private static void Main(string[] args)
{
// Generate a hierarchy
Nested root = new Nested("root");
Nested child1 = new Nested("child1");
Nested child2 = new Nested("child2");
Nested child3 = new Nested("child3");
child1.Children.Add(child2);
child1.Children.Add(child3);
root.Children.Add(child1);
Nested deserialized;
BinaryFormatter binaryFmt = new BinaryFormatter();
// Serialize
using (var fs = new FileStream("Nested.xml", FileMode.OpenOrCreate))
{
binaryFmt.Serialize(fs, root);
}
// Deserialize
using (var fs = new FileStream("Nested.xml", FileMode.OpenOrCreate))
{
deserialized = (Nested)binaryFmt.Deserialize(fs);
}
// deserialized.Children contains one null child
Console.WriteLine("Original Name: {0}", root.Name);
Console.WriteLine("New Name: {0}", deserialized.Name);
}
}
}
在上面的示例中,Nested.GetObjectData 和 Nested 的序列化器构造函数被调用了 4 次,一个接一个。
将子项作为嵌套数组添加到序列化程序将在反序列化时返回正确大小的数组,但所有元素都将为空。
但是,将类型从 Nested array 更改为 Nested List 将在调用子元素的构造函数后神奇地修复空元素。
我想知道的是:
更新:
好像还有一个额外的接口(interface),IDeserializationCallback.OnDeserialization,在反序列化发生后调用(调用顺序是不确定的)。您可以将反序列化的数组存储在构造函数中的临时成员变量中,然后将其分配给此方法中的列表。除非我遗漏了什么,否则这似乎不太理想,因为您必须使用临时变量来扰乱您的实现。
最佳答案
我会选择复合模式。下面的解决方案解决了 BinaryFormatter
(就像在您的 Main 中一样)和 XmlSerializer
方法,如果您改用它的话。 Composite
和 Component
替换您的 Nested
类。
[Serializable()]
[XmlRoot("component", Namespace="", IsNullable=false)]
public partial class CT_Component
{
[XmlAttribute("name")]
public string Name { get; set;}
}
[Serializable()]
[XmlRoot("composite", Namespace="", IsNullable=false)]
public partial class CT_Composite
{
[XmlElement("component", typeof(CT_Component))]
[XmlElement("composite", typeof(CT_Composite))]
public object[] Items { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
}
我从下面的 xsd 创建了那些,我总是从 xsd 到生成的类,因为我永远无法获得正确的属性装饰。它的要点是递归 CT_Composite
类型:
<xs:element name="component" type="CT_Component" />
<xs:element name="composite" type="CT_Composite" />
<xs:complexType name="CT_Component">
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="CT_Composite" >
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="component" />
<xs:element name="composite" type="CT_Composite" />
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
序列化代码是一样的。变量声明:
var composite = new CT_Composite() {
Name = "root",
Items = new object[] {
new CT_Composite() {
Name = "child1",
Items = new object[] {
new CT_Component() {Name="child2"},
new CT_Component() {Name="child3"}
} } } };
如果你对模式更加正统,你可以使用:
[Serializable()]
[XmlRoot("component", Namespace="", IsNullable=false)]
public class Component {
[XmlAttribute("name")] public string Name { get; set;}
}
[Serializable()]
[XmlRoot("composite", Namespace="", IsNullable=false)]
public class Composite : Component {
[XmlElement("component", typeof(Component))]
[XmlElement("composite", typeof(Composite))]
public object[] Items { get; set; }
}
关于c# - ISerializable 与递归 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33668133/
我目前正在努力保存更大的对象结构,其中包含我正在处理的应用程序中的“项目”所需的所有数据。数据是诸如图片、流文档以及更基本的数据类型之类的东西。 现在,我目前的方法是在我需要保存的对象中包含的所有类上
我有一个类,其中包含我正在序列化的一些数据: [Serializable] public class SomeData { public int NumericField; publi
我必须使用一个旧应用程序,该应用程序使用 binaryFormatter 将应用程序数据序列化为文件流(例如在名为“data.oldformat”的文件中) 没有任何优化,主类已用属性标记 publi
考虑以下类的 POD 类型: public class Price { public decimal OfferPrice { get; set; } } 此类的对象是从服务器检索的,所以让我们用可序
我打算使用序列化来做克隆。我必须让我的类 ISerializable。但是它的父类(super class)和所有引用的变量类呢?我需要让它们全部 ISerializable 吗? 如果我使用 ISe
ISerializable 接口(interface)只提供了一种序列化对象的方法。反序列化进程由构造函数管理。 问题是,构造函数不能返回实例,因为构造函数创建了一个新实例。 在我的实现中,有几个属性
我们的任务非常简单,我们有一个对象图,其中每个对象 (IDItem) 都有一个唯一的 ID。对象图存在两次,在客户端和服务器机器上。 现在我们将一些可序列化的命令传递给服务器。该命令具有一些 IDIt
我正在编写自己的 IFormatter 实现,但我想不出一种方法来解决两种都实现 ISerializable 的类型之间的循环引用。 这是通常的模式: [Serializable] class Foo
我们有一个遗留类A,它是[Serializable],但不是ISerializable。由于各种原因,必须修补此类以实现 ISerializable。 问题是我们仍然需要能够加载旧的保存文件,这些文件
我想为包含相似类型子项列表的 C# 类实现 ISerializable。考虑以下示例: using System; using System.Collections.Generic; using Sy
我很难理解 ISerializable 接口(interface)的必要性......我想我在这个主题中遗漏了一些非常重要的东西,所以如果有人能帮助我,我将不胜感激。 这很好用- [Serializa
我有扩展方法 public static T DeepClone(this T source) where T : ISerializable { .. } 当我添加“where T : I
我正在尝试使用 Iserializable 在 Android 中传递对象,但它返回“无法从 native 句柄激活类型的实例”异常。 下面是我的代码。 [FBUserParcel.cs] using
我正在编写自定义序列化程序,我刚刚完成了用于处理 ISerializable.GetObjectData 的部分的实现。但是当我去反序列化信息并将其重新应用于图形时,我没有看到 Set-ObjectD
我正在阅读 msdn 上的自定义序列化文章:http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspx 里面提到了实现自定义序列化
我必须在派生类中实现 ISerializable(以执行一些自定义序列化/反序列化),但父类被标记为 [Serializable]。序列化“有效”(我可以序列化和反序列化而不会出现运行时错误)但看起来
我有一组用户定义的类型,它们已经实现了 ISerializable 接口(interface),现在我想将它们托管在服务器端应用程序中,并通过使用 DataContract 属性标记它们来向客户端公开
我有一个看起来像这样的包装列表: [JsonObject(MemberSerialization.Fields)] public class OrderManager : IEnumerable, I
我对继承类中 ISerializable 的正确实现有疑问。 我有两个类,AbstractBaseClass 及其实现 BaseClass。在实现派生自 BaseClass 的 FinalClass
我有一个类通过 XLINQ 实现它自己的(反)序列化,我会喜欢让我类(class)的客户尝试对我的类(class)进行 XMLSerialze而是调用了我的 XLINQ 方法。 这可能吗? 最佳答案
我是一名优秀的程序员,十分优秀!