views:

29

answers:

1

I want to serialize a class. In this class there's a property, type of Class1, while there are other properties in Class1.

public abstract class ComponentBase
{
 [ToSerialize]//An attribute defined my me, indicating whether or not to serialize this property.
 public ComponentArgs Parameters { get; set; }
}

public class ComponentArgs
{
        public string WorkingPath { get; set; }

        public IList<Language> Languages { get; set; }

        public string ComponentOutputPath { get; set; }
}

The information serialized must be put into a Dictionary, such as

ComponentSettings[str_Name]=str_Value.

The method used in reading this value is Reflection.

pinfo: Property Info got via Type.GetProperties();

componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());

The information after serialization is:

<Parameters>MS.STBIntl.Pippin.Framework.ComponentArgs</Parameters>

instead of the value of ComponentArgs.WorkingPath.

The solution I thought of is to append to the following line an if judgement:

    componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());

if(pinfo is ComponentArgs)
 componentSettings.Add(pinfo.Name, pinfo.GetValue(
  (ComponentArgs)this, null).WorkingPath+"\n"+
  LanguageList+"\n"+ //Language list is a concatinated string of all elements in the list.
  (ComponentArgs)this, null).ComponentOutputPath+"\n"+
  );

When deserializing, add a judgement of whether the value contains more than 2 "\n", if so, extract each value from the string.

But this way seems clumsy and much more like an workaround. I wonder if there's any more professional way of doing it? My reviewer is very particular and he

won't accept such a solution. If you know a way, could you please share it with me? Thanks a lot.

A: 

There are lots of ways to use inbuilt serialization

The simplest and oldest is the [Serializable] attribute there is another that tells .net to not serialize members

you can also use the wcf [DataContact] system to serialize stuff.

there is the IXMLSerializable attribute which allows you to implmement custom xml readers and writers for you classes

No need to roll your own - its been done.

John Nicholas