alexeyxo / protobuf-swift

Google ProtocolBuffers for Apple Swift
http://protobuf.io/#swift
Apache License 2.0
938 stars 138 forks source link

Deserialize Array of Objects #194

Closed perlmunger closed 7 years ago

perlmunger commented 7 years ago

Version of protoc (protoc --version)

3.0

Version of ProtocolBuffers.framework

3.0.0

.proto file to reproduce

syntax = "proto2";
package EyeRepMongoDataImport.Models;

message AccountAddressEntity {
   optional string AddressId = 1;
   optional string Name = 2;
   optional string Address = 3;
   optional string Address2 = 4;
   optional string City = 5;
   optional string State = 6;
   optional string PostalCode = 7;
   optional string Country = 8;
   optional string Email = 9;
   optional string Phone = 10;
   optional string Fax = 11;
   optional string DefaultShipMethod = 12;
}
message AccountEntity {
   optional string Name = 1;
   optional string Address = 2;
   optional string Address2 = 3;
   optional string City = 4;
   optional string State = 5;
   optional string PostalCode = 6;
   optional string Country = 7;
   optional string Email = 8;
   optional string Phone = 9;
   optional double CurrentBalance = 10 [default = 0];
   optional string Note = 11;
   optional string Status = 12;
   optional string Sort = 13;
   optional double CurrentYTDSales = 14 [default = 0];
   optional double PriorYTDSales = 15 [default = 0];
   optional double Rolling12Months = 16 [default = 0];
   optional double PriorRolling12Months = 17 [default = 0];
   optional double Aging30Days = 18 [default = 0];
   optional double Aging60Days = 19 [default = 0];
   optional double Aging90Days = 20 [default = 0];
   optional bool Prospect = 21 [default = false];
   optional string Fax = 22;
   optional string Labs = 23;
   optional string ParentAccountID = 24;
   optional string SalesOrg = 25;
   optional string DistributionChannel = 26;
   optional double LastModifiedDate = 27 [default = 0];
   repeated AccountOrderHistoryEntity OrderHistoryEntries = 28;
   repeated AccountAddressEntity ShippingAddresses = 29;
   repeated AccountExtensionEntity Extensions = 30;
}
message AccountExtensionEntity {
   optional string FieldName = 1;
   optional string FieldValue = 2;
   optional int32 DisplayOrder = 3 [default = 0];
   optional string RepId = 4;
}
message AccountOrderHistoryEntity {
   optional string id = 1;
   optional string OrderNumber = 2;
   optional string OrderType = 3;
   optional string InvoiceNumber = 4;
   optional string WebOrderNumber = 5;
   optional string OrderStatus = 6;
   optional double TaxAmount = 7 [default = 0];
   optional double ShipAmount = 8 [default = 0];
   optional string UPC = 9;
   optional int32 Quantity = 10 [default = 0];
   optional double Price = 11 [default = 0];
   optional double OrderDate = 12 [default = 0];
   optional double ShipDate = 13 [default = 0];
   optional string TrackingNumber = 14;
   optional string TrackingType = 15;
}

Description

When my binary file generated from our server running .NET web services contains one record, code like this:

do {
    if let data = try? Data(contentsOf: Bundle.main.url(forResource: "account.bin", withExtension: nil)!) {
        let account = try EyeRepMongoDataImport.Models.AccountEntity.parseFrom(data: data)
        print(account)
    }
} catch let exception {
    print(exception)
}

works fine. However, when it's an array of records, I get an error: invalidProtocolBuffer("InvalidUTF8StringData"). I realize that's the wrong way to load a file containing an array of records, but the documentation doesn't provide me with a clear understanding on what code I should be using to do so. What am I missing?

Thanks.

perlmunger commented 7 years ago

Going to close this. Server guy provided a different .proto and now it works. Thanks!