1

C# クラスを XML ファイルにシリアル化する方法を調べてきましたが、非常に基本的な例しか見つかりませんでした。他のクラスもカプセル化されているクラスをシリアル化しようとしています。

より具体的には、トランジションのリスト、TotalStates、および Alphabet をカプセル化した決定論的有限オートマトン クラスがあります。Transitions と States も C# クラスで定義されています。

クラスをそのままシリアル化しようとすると、出力 XML ファイルが空白になるため、カプセル化されたクラスを正しく動作させるには、余分な作業が必要になると思います。カプセル化されたすべてのユーザー定義クラスを XML にも配置するには何が必要ですか。

これが私がシリアル化しようとしているクラスです。現在、私の属性は初期化されていません。

  public class XMLDoc
    {
        public XMLDoc()
        {
            AllStates = new List<State>();
            alphabet = new List<char>();
            transitions = new List<Transition>();

            alphabet.Add('1');
            alphabet.Add('0');


        }
        List<State> AllStates; // Our set of all States
        List<Char> alphabet;    // Our alphabet set
        List<Transition> transitions; //; Our set of transitions
        State startState, finalState;
    }

これがStateクラスです

  public class State
    {
        public State(int value)
        {
            id = value;
            type = StateType.Normal;
        }

        public void makeInitial()
        {
            type = StateType.Initial;
        }

        public void makeFinal()
        {
            type = StateType.Final;
        }
        public int getID()
        {
            return this.id;
        }

        int id;
        StateType type;

        List<Transition> transitions; // This list is going to be all transitions that have this State as the Initial value
    }

そして、これがトランジションクラスです

  public class Transition
    {
        public Transition(State initial, Char accept, State final)
        {
            this.init = initial;
            this.acceptor = accept;
            this.final = final;
        }

        public int getInit(){
            return init.getID();
        }

        public int getFinal()
        {
            return final.getID();
        }

        public Char getAcceptor()
        {
            return acceptor;
        }
        State init; // This is the state we are transitioning
        Char acceptor; // This is the accepting alphabet value
        State final; // This is the state init becomes after accepting the acceptor
    }

最後に、これに似た形式の XML が必要です

<?xml version='1.0' ?>

<!-- XML Definition of a DFA by Matt Hintzke -->
<DFA>
    <!-- This defines the all used states in the DFA -->
    <STATES-SET>
        <STATE>q0</STATE>
        <STATE>q1</STATE>
        <STATE>q2</STATE>
        <STATE>q3</STATE>
    </STATES-SET>

    <!-- This defines the alphabet -->
    <ALPHABET>
        <CHARACTER>1</CHARACTER>
        <CHARACTER>0</CHARACTER>
    </ALPHABET>

    <!-- This defines all transitions -->
    <TRANSITION-SET>

        <!-- A transition block represents all transitions that can be made from a single initial state -->
        <TRANSITION-BLOCK>
            <!-- Hence, this block defines all transitions from the INIT-STATE q0 to any other states -->
            <INIT-STATE>q0</INIT-STATE>
            <!-- A transition represents any ACCEPTOR character from the INIT-STATE to some FINAL state -->
            <TRANSITION>
                <ACCEPTOR>1</ACCEPTOR>
                <FINAL>q1</FINAL>
            </TRANSITION>

            <TRANSITION>
                <ACCEPTOR>0</ACCEPTOR>
                <FINAL>q2</FINAL>
            </TRANSITION>
        </TRANSITION-BLOCK>



        <TRANSITION-BLOCK>
            <INIT-STATE>q1</INIT-STATE>
            <TRANSITION>
                <ACCEPTOR>1</ACCEPTOR>
                <FINAL>q0</FINAL>
            </TRANSITION>

            <TRANSITION>
                <ACCEPTOR>0</ACCEPTOR>
                <FINAL>q3</FINAL>
            </TRANSITION>
        </TRANSITION-BLOCK>


        <TRANSITION-BLOCK>
            <INIT-STATE>q2</INIT-STATE>
            <TRANSITION>
                <ACCEPTOR>1</ACCEPTOR>
                <FINAL>q3</FINAL>
            </TRANSITION>

            <TRANSITION>
                <ACCEPTOR>0</ACCEPTOR>
                <FINAL>q0</FINAL>
            </TRANSITION>
        </TRANSITION-BLOCK>



        <TRANSITION-BLOCK>
            <INIT-STATE>q3</INIT-STATE>
            <TRANSITION>
                <ACCEPTOR>1</ACCEPTOR>
                <FINAL>q2</FINAL>
            </TRANSITION>

            <TRANSITION>
                <ACCEPTOR>0</ACCEPTOR>
                <FINAL>q1</FINAL>
            </TRANSITION>
        </TRANSITION-BLOCK>
    </TRANSITION-SET>


    <!-- This defines all starting states -->
    <STARTING-SET>
        <STATE>q0</STATE>
    </STARTING-SET>

    <!-- This defines all final states -->
    <FINAL-SET>
        <STATE>q3</STATE>
    </FINAL-SET>
</DFA>

最後に、シリアル化するコードを次に示します...

    public void Serialize()
    {
        XMLDoc mydoc = new XMLDoc();

        XmlSerializer ser = new XmlSerializer(typeof(XMLDoc));
        StreamWriter writer = new StreamWriter("test.xml");
        ser.Serialize(writer, mydoc);
        writer.Close();
    }
4

1 に答える 1

0

プライベート フィールドがあるため、これらのクラスはシリアル化されませんが、パブリック プロパティを使用する必要があります。

更新:以下は、クラスに基づいてLinqPadで実行されるサンプルです(シリアル化には関係がないため、メソッドを削除しました):

void Main()
{
     XMLDoc mydoc = new XMLDoc();

        XmlSerializer ser = new XmlSerializer(typeof(XMLDoc));
        StreamWriter writer = new StreamWriter(@"D:\test.xml");
        ser.Serialize(writer, mydoc);
        writer.Close();
}

public class XMLDoc
    {
        public XMLDoc()
        {
            AllStates = new List<State>();
            alphabet = new List<char>();
            transitions = new List<Transition>();
            alphabet.Add('1');
            alphabet.Add('0');
        }
        public List<State> AllStates{get;set;} // Our set of all States
        public List<Char> alphabet{get;set;}    // Our alphabet set
        public List<Transition> transitions{get;set;} //; Our set of transitions
        public State startState{get;set;}
        public State finalState{get;set;}
    }


     public class State
     {
      //note - no explicitly defined default ctor here
      //that is OK as long as you don't have any other ctors defined.
      //although bear in mind that you probably should have one
      //to intialise 'type' and 'transitions'
      public int id{get;set;}
      public StateType type{get;set;}
      public List<Transition> transitions{get;set;} // This list is going to be all transitions that have this State as the Initial value
     }


    public class StateType
    {
      //did not have any code for this class...
    }

    public class Transition
    {
        public Transition(){} //must have default ctor to serialise.
        public Transition(State initial, Char accept, State final)
        {
            this.init = initial;
            this.acceptor = accept;
            this.final = final;
        }        
        public State init{get;set;} // This is the state we are transitioning
        public Char acceptor{get;set;} // This is the accepting alphabet value
        public State final{get;set;} // This is the state init becomes after accepting the acceptor
    }

これにより、次が生成されます。

<?xml version="1.0" encoding="utf-8"?>
<XMLDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AllStates />
  <alphabet>
    <char>49</char>
    <char>48</char>
  </alphabet>
  <transitions />
</XMLDoc>

生成された XML の「形状」を制御するために使用できるさまざまなシリアライゼーション属性を確認する必要があることに注意してください。

(Linq から XML へ) XML ドキュメントを非常に簡単に作成するために使用できるXDocumentクラスを検討することを検討してSystem.Xml.Linqください。必要な形式のタイプにより適している可能性があります。

それが役立つことを願っています。

于 2013-11-13T21:36:47.610 に答える