Re: XmlSerializer Collection with Collections
From: Matthew Baskey (matthew.baskey_at_gmail.com)
Date: 09/02/04
- Next message: david: "XMLREADER"
- Previous message: Oleg Tkachenko [MVP]: "Re: SelectNodes"
- In reply to: Dino Chiesa [Microsoft]: "Re: XmlSerializer Collection with Collections"
- Next in thread: Dino Chiesa [Microsoft]: "Re: XmlSerializer Collection with Collections"
- Reply: Dino Chiesa [Microsoft]: "Re: XmlSerializer Collection with Collections"
- Messages sorted by: [ date ] [ thread ]
Date: 2 Sep 2004 04:32:08 -0700
Hi thanks for the reply,
As you said the first method did work but as you mentioned I lost
type-enforcement provided by OptionList, my calling code changed to
this...
<code>
QuestionList myList = new QuestionList();
myList.AddQuestion( new Serialize.Question("This is better than sliced
bread?","Input",9,false ) );
myList.AddQuestion( new Serialize.Question("input question","input",
8, true, true, 7, 1, "hello", Serialize.Question.Validation.Currency,
"this is the answer"));
ArrayList arl = new ArrayList();
arl.Add( new Serialize.Option("first",true,"hovertext",false) );
arl.Add( new Serialize.Option("second",true,"hovertext",true) );
myList.AddQuestion( new Serialize.Question("What is slayer of
conformity?","selection",3,false, arl ) );
Serialize.WriteXml(myList);
</code>
I then tried your 2nd solution and the calling code above still worked
but I also noticed I could add Options without them being part or
under
a Question....
Option o1 = new Option("first",true,"hovertext",false);
myList.AddOption(o1);
Option o2 = new Option("second",true,"hovertext",true);
myList.AddOption(o2);
The xml looking something like this....top node fragment is still
filling and adding an arraylist to the question, bottom nodes are
added with the AddOption
command.
<Question text="What is slayer of conformity?" type="selection"
score="3" mandatory="false" multiLine="false" maxlength="0"
minlength="0" validate="None">
<Option text="first" selected="true" tooltip="hovertext"
answer="false" />
<Option text="second" selected="true" tooltip="hovertext"
answer="true" />
</Question>
<Option text="first" selected="true" tooltip="hovertext"
answer="false" />
<Option text="second" selected="true" tooltip="hovertext"
answer="true" />
Might there be a way to use addoption to add it to the current
question??
Perhaps I must fiddle with the methods, getter & setters, but I want
to know if you have any ideas or am I going in the right direction
here.
Thanks,
Matt
p.s. is .net version 2 changing xml serialization?
"Dino Chiesa [Microsoft]" <dinoch@online.microsoft.com> wrote in message news:<eKyy0xFkEHA.1996@TK2MSFTNGP09.phx.gbl>...
> > I really want
> > to know if my class is properly constucted.
>
> your class is fine.
>
> But it is possible to shape the XML differently. For example, if you change
> from this:
> [XmlElement("SelectionList")] public OptionList optionlist;
>
> to this:
> [XmlElement("Option", typeof(Option))]
> public ArrayList options;
>
> you will get this:
> <Test>
> <Question .../>
> <Question ...>
> <Option .../>
> <Option .../>
> </Question>
> </Test>
>
> But you will lose the type-enforcement provided by OptionList. Another
> way to do it is to embed the Option[] in the Question type directly,
> instead of going through the intermediary type OptionList. So, move the
> following snippet from OptionList directly into Question:
>
> --- begin snip ----
> private ArrayList listOptions= new ArrayList();
>
> [XmlElement("Option")]
> public Option[] Options
> {
> get {..}
> set {...}
> }
> public int AddOption( Option option )
> {
> return listOptions.Add( option );
> }
> --- end snip ----
>
> This retains the type enforcement you have now, and will get you the simpler
> XML you described. In fact this approach seems more parallel with your
> existing design for QuestionList. Put aside the names for a moment and
> think about it. Instead of QuestionList, let's call it QuestionSet. In
> the current design,
>
> - a bunch of Question objects are contained within a QuestionSet
> - a bunch of Option objects are contained within an OptionList
> - a single OptionList object is contained within a Question
>
> Whereas in the modified version,
>
> - a bunch of Question objects are contained within a QuestionSet
> - a bunch of Option objects are contained within a Question.
>
> It is the extra level of object containment in the original version that
> gets you the extra level of XML hierarchy.
>
>
> -Dino
>
>
> "MattB" <MBaskey2002@yahoo.co.uk> wrote in message
> news:b4a90122.0409010351.f4fc683@posting.google.com...
> > Hello I got this working but it is not how I really want it, basically
> > I have an xml file which has a root of <test> and can be filled with 3
> > different types of <question> elements with different attributes, all
> > share a base set of 4, one of the question types can have children
> > with <option> elements, this is how the xml looks after
> > serialization....
> >
> > If you notice there is an extra <SelectionList> around the <option>'s
> > in the
> > final <question>, how can I write my class so I don't have this extra
> > <SelectionList> element....my class follows, you can see in the 2nd
> > public Question constructor is where I add the OptionList type....any
> > ideas, I know that really there is nothing wrong with having an extra
> > <SelectionList> element around the <option> elements but I really want
> > to know if my class is properly constucted.
> >
> >
> > <?xml version="1.0" encoding="utf-8"?>
> > <Test xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
> > <Question text="What is love?" type="Input" score="3"
> > mandatory="false" multiLine="false" maxlength="0" minlength="0"
> > validate="None" />
> > <Question text="This is better than sliced bread?" type="Input"
> > score="9" mandatory="false" multiLine="false" maxlength="0"
> > minlength="0" validate="None" />
> > <Question text="input question" type="Input" score="8"
> > mandatory="true" multiLine="true" maxlength="7" minlength="1"
> > initialvalue="hello" validate="Currency" answer="this is the answer"
> > />
> > <Question text="What is square root of 2?" type="selection"
> > score="3" mandatory="false" multiLine="false" maxlength="0"
> > minlength="0" validate="None">
> > <SelectionList>
> > <Option text="first" selected="true" tooltip="hovertext"
> > answer="false" />
> > <Option text="second" selected="true" tooltip="hovertext"
> > answer="true" />
> > </SelectionList>
> > </Question>
> > </Test>
> >
> > using System;
> > using System.Collections;
> > using System.IO;
> > using System.Xml;
> > using System.Xml.Serialization;
> >
> > namespace TestCreator
> > {
> > public class TestSerializer
> > {
> > public TestSerializer()
> > {
> > //
> > // TODO: Add constructor logic here
> > //
> > }
> >
> > //test class which will be serialized
> > [XmlRoot("Test")]
> > public class QuestionList
> > {
> > private ArrayList listQuestions;
> >
> > public QuestionList()
> > {
> > listQuestions = new ArrayList();
> > }
> >
> > [XmlElement("Question")]
> > public Question[] Questions
> > {
> > get
> > {
> > Question[] questions = new Question[ listQuestions.Count ];
> > listQuestions.CopyTo( questions );
> > return questions;
> > }
> > set
> > {
> > if( value == null ) return;
> > Question[] questions = (Question[])value;
> > listQuestions.Clear();
> > foreach( Question question in questions )
> > listQuestions.Add( question );
> > }
> > }
> >
> > public int AddQuestion( Question question )
> > {
> > return listQuestions.Add( question );
> > }
> > }
> >
> > public class OptionList
> > {
> > private ArrayList listOptions;
> >
> > public OptionList()
> > {
> > listOptions = new ArrayList();
> > }
> > [XmlElement("Option")]
> > public Option[] Options
> > {
> > get
> > {
> > Option[] options = new Option[ listOptions.Count ];
> > listOptions.CopyTo( options );
> > return options;
> > }
> > set
> > {
> > if( value == null ) return;
> > Option[] options = (Option[])value;
> > listOptions.Clear();
> > foreach( Option option in options )
> > listOptions.Add( option );
> > }
> > }
> > public int AddOption( Option option )
> > {
> > return listOptions.Add( option );
> > }
> > }
> >
> > public class Question
> > {
> > [XmlAttribute("text")] public string questionText;
> > [XmlAttribute("type")] public string type;
> > [XmlAttribute("score")] public int score;
> > [XmlAttribute("mandatory")] public bool mandatory;
> > [XmlAttribute("multiLine")] public bool multiline;
> > [XmlAttribute("maxlength")] public int maxlength;
> > [XmlAttribute("minlength")] public int minlength;
> > [XmlAttribute("initialvalue")] public string initialvalue;
> > [XmlAttribute("validate")] public Validation validate;
> > [XmlAttribute("answer")] public string answer;
> > [XmlElement("SelectionList")] public OptionList optionlist;
> > //[XmlElement("go")] public ArrayList optionlist;
> >
> > public enum Validation
> > {
> > None,
> > Date,
> > Integer,
> > Currency
> > }
> > public Question()
> > {
> > }
> >
> > public Question( string QuestionText, string Type, int Score, bool
> > Mandatory, OptionList opl )
> > {
> > questionText = QuestionText;
> > type = Type;
> > score = Score;
> > mandatory = Mandatory;
> > optionlist = opl;
> > }
> >
> > public Question( string QuestionText, string Type, int Score, bool
> > Mandatory, bool MultiLine, int MaxLength, int MinLength, string
> > InitialValue, Validation Validate, string Answer)
> > {
> > questionText = QuestionText;
> > type = Type;
> > score = Score;
> > mandatory = Mandatory;
> > multiline = MultiLine;
> > maxlength = MaxLength;
> > minlength = MinLength;
> > initialvalue = InitialValue;
> > validate = Validate;
> > answer = Answer;
> > }
> > }
> >
> > public class Option
> > {
> > [XmlAttribute("text")] public string label;
> > [XmlAttribute("selected")] public bool selected;
> > [XmlAttribute("tooltip")] public string tooltip;
> > [XmlAttribute("answer")] public bool answer;
> >
> > public Option()
> > {
> > }
> >
> > public Option( string Label, bool Selected, string Tooltip, bool
> > Answer )
> > {
> > label = Label;
> > selected = Selected;
> > tooltip = Tooltip;
> > answer = Answer;
> > }
> > }
> >
> > public static void Serialize(QuestionList myList)
> > {
> > XmlSerializer s = new XmlSerializer( typeof( QuestionList ) );
> > TextWriter w = new StreamWriter( @"c:\list.xml" );
> > s.Serialize( w, myList );
> > w.Close();
> > }
> > }
> > }
> >
> > To test do this:
> > TestSerializer.QuestionList myList = new
> > TestSerializer.QuestionList();
> > myList.AddQuestion( new TestSerializer.Question("What is
> > love?","Input",3,false ) );
> >
> > TestSerializer.OptionList opl = new TestSerializer.OptionList();
> > opl.AddOption( new TestSerializer.Option("first",true,"hovertext",false));
> > opl.AddOption( new TestSerializer.Option("second",true,"hovertext",true));
> > myList.AddQuestion( new TestSerializer.Question("What is the square
> > root of 2?","selection",3,false,opl ) );
> > TestSerializer.Serialize(myList);
- Next message: david: "XMLREADER"
- Previous message: Oleg Tkachenko [MVP]: "Re: SelectNodes"
- In reply to: Dino Chiesa [Microsoft]: "Re: XmlSerializer Collection with Collections"
- Next in thread: Dino Chiesa [Microsoft]: "Re: XmlSerializer Collection with Collections"
- Reply: Dino Chiesa [Microsoft]: "Re: XmlSerializer Collection with Collections"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|