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

Reply via email to