[C#] DefaultValueAttribute voor optionele Guid

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 21:28
Ik probeer een WebService aan te spreken met als parameter een XML string. Een deel uit die xml:

XML:
1
2
3
4
<tasks>
   <task id="10" resource="1" exclusive="true" duration="120" guid="0446636b-e212-47a4-9843-4b4d42368604" />
   ....
</tasks>


C#:
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
28
29
30
  ....
  public class Task
  {
    private bool _isExclusive = true;
    private int _resourceID = -1;
    private Guid _guid = Guid.Empty;
    ...
    [XmlAttribute(AttributeName="exclusive")]
    public bool IsExclusive
    {
      get { return _isExclusive; }
      set { _isExclusive = value; }
    }
    ....
    [XmlAttribute(AttributeName = "resource")]
    [DefaultValue(-1)]
    public int ResourceID
    {
      get { return _resourceID; }
      set { _resourceID = value; }
    }

    [XmlAttribute(AttributeName = "guid")]
    [DefaultValue(typeof(Guid), "00000000-0000-0000-0000-000000000000")]
    public Guid TaskGuid
    {
      get { return _guid; }
      set { _guid = value; }
    }
  }



Attributen 'resource' en 'guid' zijn optioneel. Deze wil ik dus 9 van 10 keer niet mee sturen.

De DefaultValue attribute zorgt er voor dat de property niet wordt geserialized als de field '_xxxx' gelijk is aan de waarde die gepassed is aan DefaultValue. In het geval van de resource gaat dit goed. Echter voor de guid krijg ik het niet voor elkaar.

Ik heb ook geprobeerd om:
C#:
1
[DefaultValue(typeof(Guid), Guid.Empty.ToString())];

maar dit resulteert in "An attribute argument must be a constant expression, typeof expression or array creation expression". Helaas heeft DefaultValue ook geen Guid overload dus simpelweg [DefaultValue(Guid.Empty)] compiled niet. De code in het voorbeeld zorgt er voor dat de guid alsnog in de XML terecht komt.

Kan ik dit nog op een andere manier oplossen?

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je zou kunnen proberen het volgende toe te voegen
C#:
1
2
3
4
5
[XmlIgnore]
public bool TaskGuidSpecified
{
    get { return !TaskGuid.Equals( Guid.Empty ); }
}

[ Voor 6% gewijzigd door Woy op 18-08-2008 16:23 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Volgens mij heeft die DefaultValue attribute helemaal geen invloed op serializatie ? :?

Volgens mij zal de XmlSerializer je TaskGuid niet serializeren als je TaskGuid null is. Maar, dan moet je je TaskGuid property natuurlijk wel nullable maken:
code:
1
2
3
4
5
public Guid? TaskGuid
{
  get;
  set;
}
rwb schreef op maandag 18 augustus 2008 @ 16:22:
Je zou kunnen proberen het volgende toe te voegen
C#:
1
2
3
4
5
[XmlIgnore]
public bool TaskGuidSpecified
{
    get { return !TaskGuid.Equals( Guid.Empty ); }
}
Dat ook natuurlijk .... I knew it 8)7 ik heb er een maand of twee geleden nog mee gespeeld... Wat een mens al niet vergeet ...

[ Voor 40% gewijzigd door whoami op 18-08-2008 16:28 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op maandag 18 augustus 2008 @ 16:27:
Dat ook natuurlijk .... I knew it 8)7 ik heb er een maand of twee geleden nog mee gespeeld... Wat een mens al niet vergeet ...
Het is ook niet een feature die erg goed gedocumenteerd is. Ik heb ook een hoop lopen %$@!@% voordat ik dat een keer tegen kwam.

Er was ook nog iets dat je ook perse een setter bij die property moest hebben, maar dat was geloof ik weer een bug in Mono

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 21:28
whoami schreef op maandag 18 augustus 2008 @ 16:27:
Volgens mij heeft die DefaultValue attribute helemaal geen invloed op serializatie ? :?

Volgens mij zal de XmlSerializer je TaskGuid niet serializeren als je TaskGuid null is. Maar, dan moet je je TaskGuid property natuurlijk wel nullable maken:
code:
1
2
3
4
5
public Guid? TaskGuid
{
  get;
  set;
}
Sorry dat ik dit niet vermeld heb maar dit had ik al geprobeerd. Complex types werken niet voor xml attributes, dit werkt alleen voor Xml Elements
rwb schreef op maandag 18 augustus 2008 @ 16:22:
Je zou kunnen proberen het volgende toe te voegen
C#:
1
2
3
4
5
[XmlIgnore]
public bool TaskGuidSpecified
{
    get { return !TaskGuid.Equals( Guid.Empty ); }
}
Top, dit is de oplossing. Thanks!

[ Voor 120% gewijzigd door Niek.NET op 18-08-2008 16:55 . Reden: Crap, ik zit te editten ipv een nieuwe post ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
rwb schreef op maandag 18 augustus 2008 @ 16:32:
[...]

Het is ook niet een feature die erg goed gedocumenteerd is. Ik heb ook een hoop lopen %$@!@% voordat ik dat een keer tegen kwam.
Idd.
Je kan het doen mbhv een property zoals jij het toont, maar ook dmv een method (al even goed gedocumenteerd).

Iets met 'ShouldSerialize<PropertyName>' oid.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Idd
C#:
1
2
3
4
5
[XmlIgnore]
public bool TaskGuidSpecified
{
    get { return !TaskGuid.Equals( Guid.Empty ); }
}

En
C#:
1
2
3
4
public bool ShouldSerializeTaskGuid()
{
    return !TaskGuid.Equals( Guid.Empty );
}

Zou volgens mij hetzelfde gedrag moeten geven.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 21:28
whoami schreef op maandag 18 augustus 2008 @ 16:27:
Volgens mij heeft die DefaultValue attribute helemaal geen invloed op serializatie ? :?

[...]
Dit werkt wel degelijk. Wellicht een beetje verwarrende aangezien dit meer een design time attribute is uit de System.ComponentModel namespace.

Ik ga mijn code om die reden ook aanpassen zodat hij voor de ResourceID property ook dezelfde structuur gebruikt.
Pagina: 1