(oops, ignore the double-click!)
From "ProtoContract", I'm taking this to be a protobuf-net question.
No, it doesn't currently offer a way to serialize structs; the main
reason for this being that structs should pretty-much always be
immutable, which makes a reflection-based API (such as protobuf-net)
very tricky.It could *perhaps* be possible to automate something if
there is always a constructor with parameter names/types a 100% match
to the designated members, but it isn't something I've prioritised.
Possible workarounds at the moment:
- use a class
- use a private serialization member that returns a calss-based DTO
for your data
- use private serialization members that represent your struct
For an example of the second (although I'd need to check whether it
calls the "setter" when a non-null object is found):
struct Foo {
public Foo(string name) {
this.name = name;}
private readonly string name;
public string Name {get {return name;}}
}
[ProtoContract]
class FooDto {
[ProtoMember(1)]
public string Name {get;set;}
}
[ProtoContract]
class MyMessage {
public Foo SomeValue {get;set;}
[ProtoMember(1, Name="SomeValue")]
private FooDto SomeValueDto {
get { return new FooDto { Name = SomeValue.Name }; }
set {
if(value == null) { /* up to you... */ }
else { SomeValue = new Foo(value.Name); }
}
}
}
Or an example of the third bullet:
[ProtoContract]
class MyMessage {
public Foo SomeValue {get;set;}
[ProtoMember(1, Name="SomeValueName")]
private string SomeValueName {
get { return SomeValue.Name; }
set { SomeValue = new Foo(value); /* set all other vals
etc*/ }
}
}
----
Beyond that, nothing at the moment. Simply: custom structs don't
happen anywhere *near* as much as classes, and due to their nature
they are a bit of a pain to deal with in code, unless you are using
code-gen to create them.
Marc