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();
}