2013-11-13 3 views
1

Я изучал, как сериализовать класс C# в XML-файл, но нашел только основные примеры. Я пытаюсь сериализовать класс, у которого есть другие классы, инкапсулированные внутри него.Сериализация XML на сложном объекте

Более конкретно, у меня есть класс детерминированных конечных автоматов, в который я инкапсулировал список переходов, тотальных состояний и алфавита. Где переходы и государства также определены классы 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; 
    } 

Вот государственный класс

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> 

И, наконец, вот ко de to serialize ...

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

Пожалуйста, продемонстрируйте код, который вы используете. –

+0

Что вы думаете? – hyru

+0

Вы пытаетесь XML-сериализовать объект. Если вы хотите, чтобы мы вам помогли, вам нужно будет показать фактический код, который выполняет сериализацию. –

ответ

0

Эти классы не будут сериализованы, потому что у вас есть частные поля, но вам нужно использовать общедоступные свойства.

UPDATE: Ниже приведен пример, который работает в 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> 

Обратите внимание, что вы должны проверить различные Serialisation Attributes, которые вы можете использовать для управления «формой» сгенерированного XML, хотя, честно говоря, я не уверен на 100%, что вы можете добиться желаемого формата с помощью XMLSerialiser по умолчанию.

Возможно, вы можете взглянуть на класс XDocument, который может использоваться от System.Xml.Linq (Linq to XML) для очень простого создания документов XML - он может подойти вам лучше для того формата, который вы хотите.

Надеюсь, что это поможет.

+0

, так это значит, что я должен сделать все свойства на всех моих классах общедоступными? –

+0

Либо это, либо написать собственный сериализатор.(что не так сложно сделать) –

+0

, когда я добавил публикацию перед ними, мой конструктор XMLSerializer() сломался на InvalidOperationException –

Смежные вопросы