OK; that helps a bit; now, I've tried that with:
using Google.Protobuf;
using SCL.PC;
using System;
using System.Xml.Serialization;
static class P
{
static void Main()
{
var obj = new ClientIdentifier
{
Context = ClientIdentifier.Types.Context.Cfid,
Value = ByteString.CopyFrom(00, 01, 02, 03)
};
var ser = new XmlSerializer(obj.GetType());
ser.Serialize(Console.Out, obj);
}
}
---
I **cannot** reproduce the error you're seeing, but I *do* get another
error, as shown below.
This tells me, ultimately, that your model *isn't going to work with
XmlSerializer*. And that's fine - the code is only *tested* against the
specific API it is designed for - Google's protobuf library in this case.
If XmlSerializer on some down-level version of .NET has *even more*
problems, that's... unexpected, but not amazingly surprising.
If you want to use multiple serializers, usually you should have a
serialization DTO model *per serializer* - one that is designed for use
with that serializer.
However, there may be another option *if you want*. Google's generated code
that is contributing to the pain here. Looking at your generated code, it
looks like your schema is something like:
syntax = "proto3";
message ClientIdentifier {
Context context = 1;
bytes value = 2;
}
enum Context {
Cfid = 0;
Csn = 1;
}
Now, I can run that through protobuf-net's tooling (
https://protogen.marcgravell.com/#g50e914251fc5d16b94cdc695c8ebac20) which
gives me the simpler code (attached); if I then run that with the tweaked
code:
static class P
{
static void Main()
{
var obj = new ClientIdentifier
{
Context = Context.Cfid,
Value = new byte[] { 00, 01, 02, 03 }
};
var ser = new XmlSerializer(obj.GetType());
ser.Serialize(Console.Out, obj);
}
}
it now all works fine in my version of .NET, and I'm *guessing* that it'll
work in yours too. This is using a **different library**, specifically
protobuf-net rather than Google.ProtoBuf, but: the key point here is that
they both implement the same specification so should be interchangeable.
Up to you!
---
XmlSerializer exception.
Unhandled exception. System.InvalidOperationException: There was an error
reflecting type 'SCL.PC.ClientIdentifier'.
---> System.InvalidOperationException: To be XML serializable, types which
inherit from IEnumerable must have an implementation of Add(System.Object)
at all levels of their inheritance hierarchy. Google.Protobuf.ByteString
does not implement Add(System.Object).
at System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type
type, TypeFlags& flags)
at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type,
MemberInfo memberInfo, Boolean directReference)
at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo
source, Boolean directReference, Boolean throwOnError)
at System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo
propertyInfo)
at System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo
memberInfo)
at
System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping
mapping, StructModel model, Boolean openModel, String typeName,
RecursionLimiter limiter)
at
System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel
model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter
limiter)
at
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel
model, String ns, ImportContext context, String dataType, XmlAttributes a,
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
--- End of inner exception stack trace ---
at
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel
model, String ns, ImportContext context, String dataType, XmlAttributes a,
Boolean repeats, Boolean openModel, RecursionLimiter limiter)
at
System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel
model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter
limiter)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type
type, XmlRootAttribute root, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String
defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
at P.Main() in C:\Users\marc\source\repos\ConsoleApp14\Program.cs:line 16
On Wed, 21 Aug 2019 at 10:28, Arun <[email protected]> wrote:
> I did the same but it throwing the error.. I dont know what I am making
> mistake here . All my application are 3.5 .net version,
>
> Please find actual CS file which I am trying to serialize.
>
> On Wed, 21 Aug 2019 at 14:06, Marc Gravell <[email protected]> wrote:
>
>> K, I took the tiny bit of code you posted, and added something that uses
>> it with XmlSerializer, which basically meant implementing the interface
>> (with NIEs) and adding:
>>
>> using System;
>> using System.Xml.Serialization;
>> using pb = global::Google.Protobuf;
>> using pbr = global::Google.Protobuf.Reflection;
>>
>> static class Program
>> {
>> static void Main()
>> {
>> var ser = new XmlSerializer(typeof(ClientIdentifier));
>> var obj = new ClientIdentifier();
>> ser.Serialize(Console.Out, obj);
>> }
>> }
>>
>> ---
>>
>> And here's the thing: it works fine! So: if anyone is going to be able to
>> help you here, you're going to need to meet us half way, by *showing us the
>> code that doesn't work*.
>>
>> On Wed, 21 Aug 2019 at 07:05, Arun <[email protected]> wrote:
>>
>>>
>>> I am not able to initialize XmlSerializer class itself. It is failing
>>> saying "static Types cannot be serialized "
>>>
>>> On Wed, 21 Aug 2019 at 00:20, Marc Gravell <[email protected]>
>>> wrote:
>>>
>>>> Can you show any of your XmlSerializer code here, so can understand it?
>>>> I wouldn't expect the presence of a static type to break XmlSerializer, I
>>>> admit! But also: protobuf code doesn't usually guarantee anything other
>>>> than that it should work with the corresponding protobuf library.
>>>>
>>>> On Tue, 20 Aug 2019, 06:32 arun kumar, <[email protected]> wrote:
>>>>
>>>>> @Marc Gravell,
>>>>>
>>>>> I auto-generated ".cs" files from each ".proto" file. . Whereever a
>>>>> message declared inside another message in proto, auto-generated cs file
>>>>> is
>>>>> generated as " Nested Types " and Types class is generated as static. (I
>>>>> guess , its how the generator defined)
>>>>>
>>>>> And, I am trying to convert my xml data into CS object using
>>>>> XMLSerializer , it complains
>>>>>
>>>>> There was an error reflecting type 'SCL.PC.ClientIdentifier'. --->
>>>>>> System.InvalidOperationException: SCL.PC.ClientIdentifier+Types cannot be
>>>>>> serialized. Static types cannot be used as parameters or return types.
>>>>>
>>>>>
>>>>> All I am trying to do is ,
>>>>>
>>>>> Converting XML data --> CS Object (IMessage) --> proto buf Serialize
>>>>>> into stream
>>>>>
>>>>>
>>>>>
>>>>> Is there any way, to convert the xml data to IMessageObject.. I can
>>>>> see MessageParser has ParseJson object. Likewise, anything available for
>>>>> xml ?
>>>>>
>>>>>
>>>>> var serializer = new XmlSerializer(typeof(SCL.PC.ClientIdentifier
>>>>> ));
>>>>>
>>>>> Auto-Generated CS File :
>>>>>
>>>>> public sealed partial class ClientIdentifier :
>>>>> pb::IMessage<ClientIdentifier> {
>>>>> private static readonly pb::MessageParser<ClientIdentifier>
>>>>> _parser = new pb::MessageParser<ClientIdentifier>(() => new
>>>>> ClientIdentifier());
>>>>> private pb::UnknownFieldSet _unknownFields;
>>>>> [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
>>>>> public static pb::MessageParser<ClientIdentifier> Parser { get {
>>>>> return _parser; } }
>>>>>
>>>>> ---
>>>>>
>>>>> #region Nested types
>>>>> /// <summary>Container for nested types declared in the
>>>>> ClientIdentifier message type.</summary>
>>>>> [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
>>>>> public static partial class Types {
>>>>> public enum Context {
>>>>> /// <summary>
>>>>> /// The client's identifier consists of a functional
>>>>> identifier (FID) in big-endian format. Valid values range from 0x00000000
>>>>> to 0xFFFFFFFF.
>>>>> /// </summary>
>>>>> [pbr::OriginalName("CFID")] Cfid = 0,
>>>>> /// <summary>
>>>>> /// The client's identifier consists of an ASCII-encoded
>>>>> serial number.
>>>>> /// </summary>
>>>>> [pbr::OriginalName("CSN")] Csn = 1,
>>>>> }
>>>>>
>>>>> }
>>>>> #endregion
>>>>>
>>>>> }
>>>>>
>>>>> #endregion
>>>>>
>>>>>
>>>>> On Monday, 19 August 2019 19:56:45 UTC+5:30, Marc Gravell wrote:
>>>>>>
>>>>>> And can we see some code that actually demonstrates this problem?
>>>>>> That would really help here.
>>>>>>
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Protocol Buffers" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/protobuf/a6a61e73-3253-4191-b2a0-27cb63d26bde%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/protobuf/a6a61e73-3253-4191-b2a0-27cb63d26bde%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>
>>>
>>> --
>>> -- Arun
>>>
>>>
>>
>> --
>> Regards,
>>
>> Marc
>>
>
>
> --
> -- Arun
>
>
--
Regards,
Marc
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/protobuf/CAF95VAxmC0iX7DYE-Jg7US8xf%3D7EPZ7Sky6Ec0dYP%2BJA40cM%3DQ%40mail.gmail.com.
// This file was generated by a tool; you should avoid making direct changes.
// Consider using 'partial classes' to extend these types
// Input: my.proto
#pragma warning disable CS1591, CS0612, CS3021, IDE1006
[global::ProtoBuf.ProtoContract()]
public partial class ClientIdentifier : global::ProtoBuf.IExtensible
{
private global::ProtoBuf.IExtension __pbn__extensionData;
global::ProtoBuf.IExtension
global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
=> global::ProtoBuf.Extensible.GetExtensionObject(ref
__pbn__extensionData, createIfMissing);
[global::ProtoBuf.ProtoMember(1, Name = @"context")]
public Context Context { get; set; }
[global::ProtoBuf.ProtoMember(2, Name = @"value")]
public byte[] Value { get; set; }
}
[global::ProtoBuf.ProtoContract()]
public enum Context
{
Cfid = 0,
Csn = 1,
}
#pragma warning restore CS1591, CS0612, CS3021, IDE1006