Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C# 2.0] XML serialization stopt bij 4096 tekens

Pagina: 1
Acties:
  • 664 views sinds 30-01-2008
  • Reageer

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 16:53
Ik wil een collection van payloads serializeren naar XML (vanwege webservices). Het serializeren gaat goed, echter de weg terug niet, als ik deserializeer dan krijg ik slechts 1 payload in de collection terug terwijl er 14 in zaten. Ik bespeur wel dat de stream position op 4096 blijft steken...

Dit is de code, na de wit-regels heb ik ter test een deserialize staan en myPayloads heeft daar slechts 1 payload terwijl de this.payloads instance member er 14 had.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
XmlSerializer serializer = new XmlSerializer(typeof(Collection<Payload>));

using (MemoryStream memStream = new MemoryStream())
{
   serializer.Serialize(memStream, this.payloads);
   memStream.Position = 0;

   using (StreamReader reader = new StreamReader(memStream))
   {
      string payloadString = reader.ReadToEnd();






      
      XmlSerializer xs = new XmlSerializer(typeof(Collection<Payload>));

      byte[] byteArray = Encoding.Default.GetBytes(payloadString);

      MemoryStream mystream = new MemoryStream(byteArray);
      mystream.Position = 0;

      Collection<Payload> myPayloads = (Collection<Payload>)xs.Deserialize(mystream);
   }
}

  • /\/\|)
  • Registratie: Juli 2000
  • Laatst online: 21-11 12:02
Als je de Deserialize() doet gelijk na memStream.Position = 0, werkt het dan wel correct?

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 16:53
/\/\|) schreef op maandag 29 oktober 2007 @ 10:00:
Als je de Deserialize() doet gelijk na memStream.Position = 0, werkt het dan wel correct?
Ik heb de volgende code achter de .Position = 0 gezet:

code:
1
Collection<Payload> myPayloads = (Collection<Payload>)serializer.Deserialize(memStream);


en dit levert ook slechts 1 count op.

  • DrDelete
  • Registratie: Oktober 2000
  • Laatst online: 16:53
Het probleem is inmiddels opgelost en 't zat in de Payload class zelf. Ik heb daar de IXmlSerialize interface geimplementeerd om static code analysis violations op te lossen. In de ReadXml en WriteXml had ik een verkeerde implementatie staan

Oude code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void ReadXml(XmlReader reader)
{
   if (reader == null)
      throw new ArgumentNullException("reader");

   this.data = Encoding.Default.GetBytes(reader.ReadString());
}

public void WriteXml(XmlWriter writer)
{
   if (writer == null)
      throw new ArgumentNullException("writer");

   writer.WriteString(Encoding.Default.GetString(this.data));
}


Nieuwe code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void ReadXml(XmlReader reader)
{
   if (reader == null)
       throw new ArgumentNullException("reader");

   string dataString = reader.GetAttribute("data");

   this.data = Encoding.Default.GetBytes(dataString);

   reader.Read();
}

public void WriteXml(XmlWriter writer)
{
   if (writer == null)
      throw new ArgumentNullException("writer");

   string dataString = Encoding.Default.GetString(this.data);

   writer.WriteAttributeString("data", dataString);
}