我正在使用不确定的有限自动机构建一个应用程序,它必须保存它并从文件中读取它。我用XmlTags尝试了几十种不同的方法,但它仍然给我错误。你能告诉我应该如何定义类才能被XML序列化器序列化吗?
public class state
{
[XmlAttribute]
public string name
{ get; set; }
public List<transition> transitions
{ get; set; }
public state()
{
}
public state(string Name)
{
name = Name;
}
public void addTransition(string Letter, state NextState)
{
bool found = false;
foreach (transition tr in this.transitions)
{
if (tr.letter.Equals(Letter))
{
tr.nextStates.Add(NextState);
found = true;
break;
}
if (found == false)
{
transitions.Add(new transition(Letter, NextState));
}
}
if (found == false)
{
transitions.Add(new transition(Letter, NextState));
}
}
}
public class transition
{
[XmlAttribute]
public string letter
{ get; set; }
public List<state> nextStates
{ get; set; }
public transition()
{
}
public transition(string Letter, state NextState)
{
letter = Letter;
nextStates = new List<state>();
nextStates.Add(NextState);
}
}
public class automaton
{
public List<state> states
{ get; set; }
public automaton()
{
}
public bool isState(string StateName)
{
foreach (state st in states)
if (st.name.Equals(StateName)) return true;
return false;
}
public state getState(string StateName)
{
foreach (state st in states)
if (st.name.Equals(StateName)) return st;
return new state(StateName);
}
}
public class XMLReader
{
public static void NFAToXML(automaton Automaton, string Filename)
{
XmlSerializer serializer = new XmlSerializer(typeof(automaton));
TextWriter textWriter = new StreamWriter(@Filename);
serializer.Serialize(textWriter, Automaton);
textWriter.Close();
}
public static automaton XMLToNFA(string Filename)
{
XmlSerializer deserializer = new XmlSerializer(typeof(List<state>));
TextReader textReader = new StreamReader(Filename);
automaton automaton = new automaton();
automaton.states= (List<state>)deserializer.Deserialize(textReader);
textReader.Close();
return automaton;
}
}我希望我的XML看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<automaton xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<state name="q0" type="initial" >
<transition letter="0">
<state name="q1"></state>
<state name="q3"></state>
</transition>
<transition letter="1">
<state name="q0"></state>
<state name="q2"></state>
</transition>
</state>
<state name="q1">
<transition letter="0">
</transition>
<transition letter="1">
<state name="q3"></state>
</transition>
</state>
<state name="q2" type="accepting">
<transition letter="0">
<state name="q1"></state>
</transition>
<transition letter="1">
<state name="q0"></state>
<state name="q2"></state>
</transition>
</state>
<state name="q3">
<transition letter="0">
<state name="q1"></state>
</transition>
<transition letter="1">
<state name="q1"></state>
<state name="q2"></state>
</transition>
</state>
</automaton>求求你,帮帮忙,我试着用很多方法改变它,但都没有成功...
发布于 2013-04-14 01:32:52
状态有一个转换列表,每个转换都有一个状态列表。
这会在序列化时导致循环引用。如果您检查捕获的异常的InnerException对象,它应该会告诉您这一点。
您需要解决这个问题,比如只写入实例的ID,或者使用支持引用的序列化程序。
发布于 2013-04-14 01:26:40
我能看到的主要错误(没有编译器)是列表:要在没有包装器元素的情况下执行列表,请使用XmlElementAttribute:
[XmlElement("transition")]
public List<transition> transitions { get; set; }你也需要在“状态”上使用它-- [XmlElement("state")]
发布于 2013-04-14 01:23:39
您需要在类上定义[Serializable]属性来序列化/反序列化类对象。有关更多详细信息,请参阅链接here。
[Serializable()]
public class State
{ }https://stackoverflow.com/questions/15990587
复制相似问题