开发者

How to customize serialization of List<string> in C#

开发者 https://www.devze.com 2023-01-07 23:28 出处:网络
This is killing me.I\'ve read these: http://msdn.microsoft.com/en-us/library/开发者_Python百科athddy89(v=VS.80).aspx

This is killing me. I've read these:

http://msdn.microsoft.com/en-us/library/开发者_Python百科athddy89(v=VS.80).aspx

http://msdn.microsoft.com/en-us/library/2baksw0z(v=VS.80).aspx

But I don't see how to apply them to what I'm trying to do. I want to customize the way the following list serializes...

[Serializable]
public class FinalConcentrations : List<string> { }

so that when I pass it as the "objectToSerialze" to this...

    public void serializeObject(object objectToSerialize, Stream outputStream)
    {
        // removes the default added namespaces
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");

        XmlSerializer serial = new XmlSerializer(objectToSerialize.GetType());
        MemoryStream ms = new MemoryStream();
        serial.Serialize(ms, objectToSerialize, ns);

        StreamReader reader = new StreamReader(ms);
        ms.Position = 0;

        ms.WriteTo(outputStream);
    }

...it writes this to the output stream:

<FinalConcentrations>
   <FinalConcentration>string value 1</FinalConcentration>
   <FinalConcentration>string value 2</FinalConcentration>
   <FinalConcentration>string value 3</FinalConcentration>
</FinalConcentration>

...instead of this

<FinalConcentrations>
   <string>string value 1</string>
   <string>string value 2</string>
   <string>string value 3</string>
</FinalConcentration>

My serializeObject method is used to serialize a wide variety of objects, so I'm looking for a way to do this in my FinalConcentrations definition rather than within that method.

Please, help.


The easiest way to fix that is to pass in a wrapper object instead of the list itself, i.e.

public class FinalConcentrations {
    private readonly List<string> items = new List<string>();
    [XmlElement("FinalConcentration")]
    public List<string> Items {get {return items;}}
}

that do?


Well, when I ran your example I actually got

<?xml version="1.0"?>
<ArrayOfString>
  <string>Red</string>
  <string>Green</string>
  <string>Blue</string>
</ArrayOfString>

but by changing

  [Serializable, XmlRoot( ElementName= "FinalConcentrations")]
  public class FinalConcentrations : List<string> { }

I got

<?xml version="1.0"?>
<FinalConcentrations>
  <string>Red</string>
  <string>Green</string>
  <string>Blue</string>
</FinalConcentrations>

QED?

There are a whole bunch of XML decorator attributes that can change the serialisation, eg. XmlElement. Worth having a look at.

Best of luck.

0

精彩评论

暂无评论...
验证码 换一张
取 消