c# 数据结构存储问题
一:要存储的是一个队列,存储后应该能够从文件中读回这个队列二:队列元素的结构有点复杂,是一个包含着三个类一个链表链表里面又有一个链表的东西……,而且所有的链表的元素数量都...
一:要存储的是一个队列,存储后应该能够从文件中读回这个队列
二:队列元素的结构有点复杂,是一个包含着三个类一个链表链表里面又有一个链表的东西……, 而且所有的链表的元素数量都是不固定的,就是说只有在获得存储任务的时候才能知道。
希望给出一个存储的方案,或者是文件的结构设计,也可以存储在多个文件里,只要能完整恢复队列就可以。
队列元素的结构大致上是这样的:
QueueNode
{
___StructA a;
___StructB b;
___List<StructC> c;
}
StructC
{
___StructD d;
___StructE e;
___List<StructF> f;
}
StructF
{
int x;
}
谢谢!
一个很严重的问题是我的实际代码中用到的类远不至这么简单……
那是链表套链表,继承套继承的……
链表的长度是不固定的,有可能只有一个元素,也可能有一大堆(最多是15*15)
类里面的元素基本上是没有int,char这一类的基本类型,一般类型名如果小于10个字算很短的了,而且至少继承了三层……差不多是从宇宙->银河系->……>铁岭一类的
由于是别人的代码,我没有办法改变类的复杂程度……
而且好多类的基类都是不可以被加上【Serializable】的……
比方说Form……,这个类的源代码我改变不了,加不上【Serializable】。但是我需要把这个东西存储到文件里去。
有什么解决方案咩? 展开
二:队列元素的结构有点复杂,是一个包含着三个类一个链表链表里面又有一个链表的东西……, 而且所有的链表的元素数量都是不固定的,就是说只有在获得存储任务的时候才能知道。
希望给出一个存储的方案,或者是文件的结构设计,也可以存储在多个文件里,只要能完整恢复队列就可以。
队列元素的结构大致上是这样的:
QueueNode
{
___StructA a;
___StructB b;
___List<StructC> c;
}
StructC
{
___StructD d;
___StructE e;
___List<StructF> f;
}
StructF
{
int x;
}
谢谢!
一个很严重的问题是我的实际代码中用到的类远不至这么简单……
那是链表套链表,继承套继承的……
链表的长度是不固定的,有可能只有一个元素,也可能有一大堆(最多是15*15)
类里面的元素基本上是没有int,char这一类的基本类型,一般类型名如果小于10个字算很短的了,而且至少继承了三层……差不多是从宇宙->银河系->……>铁岭一类的
由于是别人的代码,我没有办法改变类的复杂程度……
而且好多类的基类都是不可以被加上【Serializable】的……
比方说Form……,这个类的源代码我改变不了,加不上【Serializable】。但是我需要把这个东西存储到文件里去。
有什么解决方案咩? 展开
展开全部
这个,可以用对象序列化解决。在Web中的ViewState就是一个用来序列化指定对象,并存储在页面上的一个机制。
只要你要存储的对象中的成员不是相互引用,是允许的。
如 class Class1{Class2 mem;}
class Class2{Class1 mem}
对应类型Class1的所有成员的完全序列化是不能的(循环引用了)。
对于你的问题,是可以解决的,只要把要序列化的QueueNode 对象下的所有成员类型(包括成员对象类型下的成员类型)加上“[Serialable]”,你就可以通过.NET自带的序列化格式化工具来完成。具体的可参照MSDN上的,有Xml序列化和二进制序列化的方法。
只要你要存储的对象中的成员不是相互引用,是允许的。
如 class Class1{Class2 mem;}
class Class2{Class1 mem}
对应类型Class1的所有成员的完全序列化是不能的(循环引用了)。
对于你的问题,是可以解决的,只要把要序列化的QueueNode 对象下的所有成员类型(包括成员对象类型下的成员类型)加上“[Serialable]”,你就可以通过.NET自带的序列化格式化工具来完成。具体的可参照MSDN上的,有Xml序列化和二进制序列化的方法。
展开全部
其实也就是一个序列化和反序列化的过程,
记住不要直接用Queue或Queue<T>,
队列的实现自己来做,主要是Queue没有this访问器
我这里直接用的 List<T>,如果非要序列的话自己实现一个也可以的。
代码写得很粗糙:
static void Main(string[] args)
{
List<QueueNode> myQueue = new List<QueueNode>();
EnqueueToQuere(myQueue);
Console.ReadKey();
}
private static void EnqueueToQuere(List<QueueNode> myQueue)
{
StructA a1 = new StructA(111);
StructA a2 = new StructA(112);
StructB b1 = new StructB(221);
StructB b2 = new StructB(222);
StructD d1 = new StructD(333);
StructD d2 = new StructD(444);
StructE e1 = new StructE(555);
StructE e2 = new StructE(666);
StructF f1 = new StructF(777);
StructF f2 = new StructF(888);
List<StructF> lf1 = new List<StructF>();
lf1.Add(f1);
lf1.Add(f2);
StructC c1 = new StructC(d1, e1, lf1);
StructC c2 = new StructC(d2, e2, lf1);
List<StructC> lc1 = new List<StructC>();
lc1.Add(c1);
lc1.Add(c2);
QueueNode q1 = new QueueNode(a1, b1, lc1);
QueueNode q2 = new QueueNode(a2, b2, lc1);
myQueue.Add(q1);
myQueue.Add(q2);
XmlSerializer serializer = new XmlSerializer(typeof(List<QueueNode>));
Stream writer = new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);
serializer.Serialize(writer, myQueue);
writer.Close();
//XmlSerializer serializer = new XmlSerializer(typeof(List<QueueNode>));
//Stream writer = new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);
//StringWriter writer = new StringWriter();
//serializer.Serialize(writer, myQueue);
//Console.WriteLine(writer.ToString());
Stream reader = new FileStream("MyFile.xml", FileMode.Open, FileAccess.Read, FileShare.None);
List<QueueNode> o = serializer.Deserialize(reader) as List<QueueNode>;
if (o != null)
{
Console.WriteLine("反序列化成功");
Console.WriteLine(o[0].a.x.ToString());
}
reader.Close();
}
//基础类
[Serializable]
public class QueueNode
{
public StructA a;
public StructB b;
public List<StructC> c;
public QueueNode()
{ }
public QueueNode(StructA a, StructB b, List<StructC> c)
{
this.a = a;
this.b = b;
this.c = c;
}
}
public struct StructC
{
public StructD d;
public StructE e;
public List<StructF> f;
public StructC(StructD d, StructE e, List<StructF> f)
{
this.d = d;
this.e = e;
this.f = f;
}
}
public struct StructA
{
public int x;
public StructA(int x)
{
this.x = x;
}
}
public struct StructB
{
public int x;
public StructB(int x)
{
this.x = x;
}
}
public struct StructD
{
public int x;
public StructD(int x)
{
this.x = x;
}
}
public struct StructE
{
public int x;
public StructE(int x)
{
this.x = x;
}
}
public struct StructF
{
public int x;
public StructF(int x)
{
this.x = x;
}
}
记住不要直接用Queue或Queue<T>,
队列的实现自己来做,主要是Queue没有this访问器
我这里直接用的 List<T>,如果非要序列的话自己实现一个也可以的。
代码写得很粗糙:
static void Main(string[] args)
{
List<QueueNode> myQueue = new List<QueueNode>();
EnqueueToQuere(myQueue);
Console.ReadKey();
}
private static void EnqueueToQuere(List<QueueNode> myQueue)
{
StructA a1 = new StructA(111);
StructA a2 = new StructA(112);
StructB b1 = new StructB(221);
StructB b2 = new StructB(222);
StructD d1 = new StructD(333);
StructD d2 = new StructD(444);
StructE e1 = new StructE(555);
StructE e2 = new StructE(666);
StructF f1 = new StructF(777);
StructF f2 = new StructF(888);
List<StructF> lf1 = new List<StructF>();
lf1.Add(f1);
lf1.Add(f2);
StructC c1 = new StructC(d1, e1, lf1);
StructC c2 = new StructC(d2, e2, lf1);
List<StructC> lc1 = new List<StructC>();
lc1.Add(c1);
lc1.Add(c2);
QueueNode q1 = new QueueNode(a1, b1, lc1);
QueueNode q2 = new QueueNode(a2, b2, lc1);
myQueue.Add(q1);
myQueue.Add(q2);
XmlSerializer serializer = new XmlSerializer(typeof(List<QueueNode>));
Stream writer = new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);
serializer.Serialize(writer, myQueue);
writer.Close();
//XmlSerializer serializer = new XmlSerializer(typeof(List<QueueNode>));
//Stream writer = new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None);
//StringWriter writer = new StringWriter();
//serializer.Serialize(writer, myQueue);
//Console.WriteLine(writer.ToString());
Stream reader = new FileStream("MyFile.xml", FileMode.Open, FileAccess.Read, FileShare.None);
List<QueueNode> o = serializer.Deserialize(reader) as List<QueueNode>;
if (o != null)
{
Console.WriteLine("反序列化成功");
Console.WriteLine(o[0].a.x.ToString());
}
reader.Close();
}
//基础类
[Serializable]
public class QueueNode
{
public StructA a;
public StructB b;
public List<StructC> c;
public QueueNode()
{ }
public QueueNode(StructA a, StructB b, List<StructC> c)
{
this.a = a;
this.b = b;
this.c = c;
}
}
public struct StructC
{
public StructD d;
public StructE e;
public List<StructF> f;
public StructC(StructD d, StructE e, List<StructF> f)
{
this.d = d;
this.e = e;
this.f = f;
}
}
public struct StructA
{
public int x;
public StructA(int x)
{
this.x = x;
}
}
public struct StructB
{
public int x;
public StructB(int x)
{
this.x = x;
}
}
public struct StructD
{
public int x;
public StructD(int x)
{
this.x = x;
}
}
public struct StructE
{
public int x;
public StructE(int x)
{
this.x = x;
}
}
public struct StructF
{
public int x;
public StructF(int x)
{
this.x = x;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般都是从数据库或者xml文件中读取树 然后来填充treeview
如果有需要可以自己实现一个数据结构 也很简单的啊
如果有需要可以自己实现一个数据结构 也很简单的啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
既然你有这样的需求,自己另外实现一个可以【Serializable】的类,或者别人实现【Serializable】版本。两个版本可以取不同的名字。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
fd
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询