首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确定义类以将其序列化为XML?

如何正确定义类以将其序列化为XML?
EN

Stack Overflow用户
提问于 2013-04-14 01:15:11
回答 4查看 621关注 0票数 1

我正在使用不确定的有限自动机构建一个应用程序,它必须保存它并从文件中读取它。我用XmlTags尝试了几十种不同的方法,但它仍然给我错误。你能告诉我应该如何定义类才能被XML序列化器序列化吗?

代码语言:javascript
复制
 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看起来像这样:

代码语言:javascript
复制
    <?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>

求求你,帮帮忙,我试着用很多方法改变它,但都没有成功...

EN

回答 4

Stack Overflow用户

发布于 2013-04-14 01:32:52

状态有一个转换列表,每个转换都有一个状态列表。

这会在序列化时导致循环引用。如果您检查捕获的异常的InnerException对象,它应该会告诉您这一点。

您需要解决这个问题,比如只写入实例的ID,或者使用支持引用的序列化程序。

票数 2
EN

Stack Overflow用户

发布于 2013-04-14 01:26:40

我能看到的主要错误(没有编译器)是列表:要在没有包装器元素的情况下执行列表,请使用XmlElementAttribute:

代码语言:javascript
复制
 [XmlElement("transition")]
 public List<transition> transitions { get; set; }

你也需要在“状态”上使用它-- [XmlElement("state")]

票数 1
EN

Stack Overflow用户

发布于 2013-04-14 01:23:39

您需要在类上定义[Serializable]属性来序列化/反序列化类对象。有关更多详细信息,请参阅链接here

代码语言:javascript
复制
[Serializable()]        
public class State
{ }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15990587

复制
相关文章

相似问题

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