public static IdentificationMessage ReadFromBms1Stream(IBms1Reader reader)
 {
     return reader.ReadBlock(
         () => new IdentificationMessage()
         { 
             InterfaceName = reader.ReadString(),
             InterfaceVersion = reader.ReadInt16(),
             ApplicationName = reader.ReadString(),
             ApplicationVersion = VersionBase.ReadFromBms1Stream(reader),
             ApplicationInstance = reader.ReadString(),
         });
 }
 public static VersionBase ReadFromBms1Stream(IBms1Reader reader)
 {
     var type = reader.Internal.BlockTypeId;
     if (type == VersionDotNet.Bms1BlockTypeId)
     {
         return VersionDotNet.CreateFromBms1Stream(reader);
     }
     else if (type == VersionPLC.Bms1BlockTypeId)
     {
         return VersionPLC.CreateFromBms1Stream(reader);
     }
     else
     {   // TODO: test it, it reads another block-frame ?
         return reader.ReadBlock<VersionPLC>(null); // skip when null or unknown block type
     }
 }
 /// <summary>
 /// Here we demonstrate how to stream a member class of a closed library.
 /// The extension method reads System.Version from a BMS1 stream.
 /// </summary>
 public static Version ReadFromBms1Stream(this Version version, IBms1Reader reader)
 {
     return reader.ReadBlock(
         () => new Version(reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32()));
 }
        public string AdditionaInfo = "None"; // not transferred before V.2

        internal static VersionDotNet CreateFromBms1Stream(IBms1Reader reader)
        {
            return reader.ReadBlock(
                () => new VersionDotNet()
                {
                    Version = MessageExtensions.ReadFromBms1Stream(null, reader),
                    // Intentionally, we do not read AdditionalInfo. This simulates a new sender and an older receiver;
                });
        }
 public static IdleMessage ReadFromBms1Stream(IBms1Reader reader)
 {
     // ReadBlock calls us back, in case the deserialization method is not null.
     return reader.ReadBlock<IdleMessage>(() => new IdleMessage());
 }
        public string AdditionaInfo = "None"; // not transferred before V.2

        internal static VersionPLC CreateFromBms1Stream(IBms1Reader reader)
        {
            return reader.ReadBlock(()=>
                {
                    var dto = new VersionPLC();
                    dto.Version = reader.ReadString();
                    dto.CpuType = reader.ReadEnum<CpuType>();
                    if (!reader.Internal.EndOfBlock)
                    {
                        // starting with V.2, more data is transferred. When sender has V.1, AdditionaInfo is "None".
                        dto.AdditionaInfo = reader.ReadString();
                    }
                    return dto;
                });
        }